pry 0.2.5pre2 → 0.2.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +29 -26
- data/Rakefile +2 -1
- data/lib/pry.rb +39 -33
- data/lib/pry/input.rb +2 -0
- data/lib/pry/output.rb +13 -1
- data/lib/pry/version.rb +1 -1
- metadata +22 -9
data/README.markdown
CHANGED
@@ -8,13 +8,14 @@ _attach an irb-like session to any object at runtime_
|
|
8
8
|
Pry is a simple Ruby REPL (Read-Eval-Print-Loop) that specializes in the interactive
|
9
9
|
manipulation of objects during the running of a program.
|
10
10
|
|
11
|
-
It is not based on the IRB codebase and
|
11
|
+
It is not based on the IRB codebase, and implements some unique REPL
|
12
|
+
commands such as `show_method` and `jump_to`
|
12
13
|
|
13
14
|
* Install the [gem](https://rubygems.org/gems/pry): `gem install pry`
|
14
15
|
* Read the [documentation](http://rdoc.info/github/banister/pry/master/file/README.markdown)
|
15
16
|
* See the [source code](http://github.com/banister/pry)
|
16
17
|
|
17
|
-
|
18
|
+
Example: Interacting with an object at runtime
|
18
19
|
---------------------------------------
|
19
20
|
|
20
21
|
With the `Pry.start()` method we can pry (open an irb-like session) on
|
@@ -62,7 +63,7 @@ OR
|
|
62
63
|
beginning Pry session for 6
|
63
64
|
pry(6)>
|
64
65
|
|
65
|
-
|
66
|
+
Example: Pry sessions can nest arbitrarily deep so we can pry on objects inside objects:
|
66
67
|
----------------------------------------------------------------------------------------
|
67
68
|
|
68
69
|
Here we will begin Pry at top-level, then pry on a class and then on
|
@@ -137,7 +138,7 @@ uses (such as implementing a quake-like console for games, for example). Here is
|
|
137
138
|
list of Pry's features along with some of its limitations given at the
|
138
139
|
end.
|
139
140
|
|
140
|
-
Features:
|
141
|
+
####Features:
|
141
142
|
|
142
143
|
* Pry can be invoked at any time and on any object in the running program.
|
143
144
|
* Pry sessions can nest arbitrarily deeply -- to go back one level of nesting type 'exit' or 'quit' or 'back'
|
@@ -145,45 +146,40 @@ Features:
|
|
145
146
|
* Pry has multi-line support built in.
|
146
147
|
* Pry gives good control over nested sessions (important when exploring complicated runtime state)
|
147
148
|
* Pry is not based on the IRB codebase.
|
148
|
-
* Pry
|
149
|
-
|
150
|
-
|
151
|
-
for
|
149
|
+
* Pry uses [RubyParser](https://github.com/seattlerb/ruby_parser) to
|
150
|
+
validate expressions in 1.8, and [Ripper](http://rdoc.info/docs/ruby-core/1.9.2/Ripper) for 1.9.
|
151
|
+
* Pry implements all the methods in the REPL chain separately: `Pry#r`
|
152
|
+
for reading; `Pry#re` for eval; `Pry#rep` for printing; and `Pry#repl`
|
153
|
+
for the loop (`Pry.start` simply wraps `Pry.new.repl`). You can
|
152
154
|
invoke any of these methods directly depending on exactly what aspect of the functionality you need.
|
153
155
|
|
154
|
-
Limitations:
|
156
|
+
####Limitations:
|
155
157
|
|
156
158
|
* Pry does not pretend to be a replacement for `irb`,
|
157
159
|
and so does not have an executable. It is designed to be used by
|
158
160
|
other programs, not on its own. For a full-featured `irb` replacement
|
159
161
|
see [ripl](https://github.com/cldwalker/ripl)
|
160
|
-
*
|
161
|
-
|
162
|
-
[RubyParser](https://github.com/seattlerb/ruby_parser)
|
163
|
-
gem internally to validate expressions, and RubyParser, as yet, only parses Ruby 1.8
|
164
|
-
code. In practice this usually just means you cannot use the new
|
165
|
-
hash literal syntax (this: syntax) or the 'stabby lambda' syntax
|
166
|
-
(->).
|
162
|
+
* Pry's `show_method` and `show_instance_method` commands do not work
|
163
|
+
in Ruby 1.8.
|
167
164
|
|
168
165
|
Commands
|
169
166
|
-----------
|
170
167
|
|
171
168
|
### The Pry API:
|
172
169
|
|
173
|
-
* `Pry.start()`
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
object as parameter.
|
170
|
+
* `Pry.start()` Starts a Read-Eval-Print-Loop on the object it
|
171
|
+
receives as a parameter. In the case of no parameter it operates on
|
172
|
+
top-level (main). It can receive any object or a `Binding`
|
173
|
+
object as parameter. `Pry.start()` is implemented as `Pry.new.repl()`
|
178
174
|
* `obj.pry` and `pry(obj)` may also be used as alternative syntax to `Pry.start(obj)`
|
179
|
-
* If, for some reason you do not want to 'loop' then use `Pry.rep()`; it
|
175
|
+
* If, for some reason you do not want to 'loop' then use `Pry.new.rep()`; it
|
180
176
|
only performs the Read-Eval-Print section of the REPL - it ends the
|
181
177
|
session after just one line of input. It takes the same parameters as
|
182
|
-
`Pry
|
183
|
-
* Likewise `Pry
|
178
|
+
`Pry#repl()`
|
179
|
+
* Likewise `Pry#re()` only performs the Read-Eval section of the REPL,
|
184
180
|
it returns the result of the evaluation or an Exception object in
|
185
|
-
case of error. It also takes the same parameters as `Pry
|
186
|
-
* Similarly `Pry
|
181
|
+
case of error. It also takes the same parameters as `Pry#repl()`
|
182
|
+
* Similarly `Pry#r()` only performs the Read section of the REPL, only
|
187
183
|
returning the Ruby expression (as a string). It takes the same parameters as all the others.
|
188
184
|
|
189
185
|
### Session commands
|
@@ -202,6 +198,13 @@ If you want to access a method of the same name, prefix the invocation by whites
|
|
202
198
|
* `exit` or `quit` or `back` will end the current Pry session and go
|
203
199
|
back to the calling process or back one level of nesting (if there
|
204
200
|
are nested sessions).
|
201
|
+
* `ls` returns a list of local variables and instance variables in the
|
202
|
+
current scope
|
203
|
+
* `cd <var>` starts a `Pry` session on the variable <var>. E.g `cd @x`
|
204
|
+
* `show_method <methname>` Displays the sourcecode for the method
|
205
|
+
<methname>. E.g `show_method hello`
|
206
|
+
* `show_instance_method <methname>` Displays the sourcecode for the
|
207
|
+
instance method <methname>. E.g `show_instance_method goodbye`
|
205
208
|
* `exit_program` or `quit_program` will end the currently running
|
206
209
|
program.
|
207
210
|
* `nesting` shows Pry nesting information.
|
data/Rakefile
CHANGED
@@ -7,7 +7,7 @@ require "#{direc}/lib/pry/version"
|
|
7
7
|
|
8
8
|
CLOBBER.include("**/*.#{dlext}", "**/*~", "**/*#*", "**/*.log", "**/*.o")
|
9
9
|
CLEAN.include("ext/**/*.#{dlext}", "ext/**/*.log", "ext/**/*.o",
|
10
|
-
"ext/**/*~", "ext/**/*#*", "ext/**/*.obj",
|
10
|
+
"ext/**/*~", "ext/**/*#*", "ext/**/*.obj", "**/*#*", "**/*#*.*",
|
11
11
|
"ext/**/*.def", "ext/**/*.pdb", "**/*_flymake*.*", "**/*_flymake")
|
12
12
|
|
13
13
|
def apply_spec_defaults(s)
|
@@ -20,6 +20,7 @@ def apply_spec_defaults(s)
|
|
20
20
|
s.description = s.summary
|
21
21
|
s.require_path = 'lib'
|
22
22
|
s.add_dependency("ruby_parser",">=2.0.5")
|
23
|
+
s.add_dependency("method_source",">=0.1.4")
|
23
24
|
s.homepage = "http://banisterfiend.wordpress.com"
|
24
25
|
s.has_rdoc = 'yard'
|
25
26
|
s.files = Dir["ext/**/extconf.rb", "ext/**/*.h", "ext/**/*.c", "lib/**/*.rb",
|
data/lib/pry.rb
CHANGED
@@ -4,6 +4,8 @@
|
|
4
4
|
direc = File.dirname(__FILE__)
|
5
5
|
|
6
6
|
require 'ruby_parser'
|
7
|
+
require 'method_source'
|
8
|
+
require 'stringio'
|
7
9
|
require "#{direc}/pry/version"
|
8
10
|
require "#{direc}/pry/input"
|
9
11
|
require "#{direc}/pry/output"
|
@@ -15,7 +17,7 @@ class Pry
|
|
15
17
|
|
16
18
|
def self.view(obj)
|
17
19
|
case obj
|
18
|
-
when String, Symbol, nil
|
20
|
+
when String, Array, Hash, Symbol, nil
|
19
21
|
obj.inspect
|
20
22
|
else
|
21
23
|
obj.to_s
|
@@ -65,7 +67,6 @@ class Pry
|
|
65
67
|
def nesting=(v)
|
66
68
|
self.class.nesting = v
|
67
69
|
end
|
68
|
-
|
69
70
|
|
70
71
|
# loop
|
71
72
|
def repl(target=TOPLEVEL_BINDING)
|
@@ -107,6 +108,8 @@ class Pry
|
|
107
108
|
target = binding_for(target)
|
108
109
|
Pry.last_result = target.eval r(target)
|
109
110
|
target.eval("_ = Pry.last_result")
|
111
|
+
rescue SystemExit => e
|
112
|
+
exit
|
110
113
|
rescue Exception => e
|
111
114
|
e
|
112
115
|
end
|
@@ -145,22 +148,27 @@ class Pry
|
|
145
148
|
eval_string.clear
|
146
149
|
when "exit_all"
|
147
150
|
throw(:breakout, 0)
|
148
|
-
when "exit", "quit", "back"
|
151
|
+
when "exit", "quit", "back", /^cd\s*\.\./
|
149
152
|
output.exit
|
150
153
|
throw(:breakout, nesting.level)
|
151
|
-
when
|
154
|
+
when "ls"
|
155
|
+
output.ls(target)
|
156
|
+
eval_string.clear
|
157
|
+
when /^cd\s+(.+)/
|
158
|
+
obj = $~.captures.first
|
159
|
+
target.eval("#{obj}.pry")
|
160
|
+
eval_string.clear
|
161
|
+
when /^show_method\s*(.+)/
|
152
162
|
meth_name = ($~.captures).first
|
153
|
-
|
154
|
-
|
155
|
-
tp.r.display
|
163
|
+
code = get_method_source(target, meth_name, :method)
|
164
|
+
output.show_method code
|
156
165
|
eval_string.clear
|
157
|
-
when
|
166
|
+
when /^show_instance_method\s*(.+)/
|
158
167
|
meth_name = ($~.captures).first
|
159
|
-
|
160
|
-
|
161
|
-
tp.r.display
|
168
|
+
code = get_method_source(target, meth_name, :instance_method)
|
169
|
+
output.show_method code
|
162
170
|
eval_string.clear
|
163
|
-
when
|
171
|
+
when /^jump_to\s*(\d*)/
|
164
172
|
break_level = ($~.captures).first.to_i
|
165
173
|
output.jump_to(break_level)
|
166
174
|
|
@@ -178,6 +186,10 @@ class Pry
|
|
178
186
|
end
|
179
187
|
end
|
180
188
|
|
189
|
+
def get_method_source(target, meth_name, kind)
|
190
|
+
target.eval("#{kind}(:#{meth_name}).source")
|
191
|
+
end
|
192
|
+
|
181
193
|
def prompt(eval_string, target, nest)
|
182
194
|
target_self = target.eval('self')
|
183
195
|
|
@@ -188,29 +200,23 @@ class Pry
|
|
188
200
|
end
|
189
201
|
end
|
190
202
|
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
rescue Exception => e
|
197
|
-
case e
|
198
|
-
when SyntaxError
|
199
|
-
case e.message
|
200
|
-
when /(parse|syntax) error.*?\$end/i, /unterminated/i
|
201
|
-
return false
|
202
|
-
end
|
203
|
-
end
|
203
|
+
if RUBY_VERSION =~ /1.9/
|
204
|
+
require 'ripper'
|
205
|
+
|
206
|
+
def valid_expression?(code)
|
207
|
+
!!Ripper::SexpBuilder.new(code).parse
|
204
208
|
end
|
205
|
-
|
206
|
-
end
|
207
|
-
|
208
|
-
def old_valid_expression?(code)
|
209
|
-
RubyParser.new.parse(code)
|
210
|
-
rescue Racc::ParseError, SyntaxError
|
211
|
-
false
|
209
|
+
|
212
210
|
else
|
213
|
-
|
211
|
+
|
212
|
+
def valid_expression?(code)
|
213
|
+
RubyParser.new.parse(code)
|
214
|
+
rescue Racc::ParseError, SyntaxError
|
215
|
+
false
|
216
|
+
else
|
217
|
+
true
|
218
|
+
end
|
219
|
+
|
214
220
|
end
|
215
221
|
|
216
222
|
def binding_for(target)
|
data/lib/pry/input.rb
CHANGED
data/lib/pry/output.rb
CHANGED
@@ -29,6 +29,10 @@ class Pry
|
|
29
29
|
puts "status Show status information"
|
30
30
|
puts "! Refresh the REPL"
|
31
31
|
puts "nesting Show nesting information"
|
32
|
+
puts "ls Show the list of variables in the current scope"
|
33
|
+
puts "cd <var> Start a Pry session on <var> (use `cd ..` to go back)"
|
34
|
+
puts "show_method <methname> Show the sourcecode for the method <method_name>"
|
35
|
+
puts "show_instance_method <methname> Show the sourcecode for the instance method <method_name>"
|
32
36
|
puts "exit/quit/back End the current Pry session"
|
33
37
|
puts "exit_all End all nested Pry sessions"
|
34
38
|
puts "exit_program/quit_program End the current program"
|
@@ -52,10 +56,18 @@ class Pry
|
|
52
56
|
puts "--"
|
53
57
|
puts "Receiver: #{Pry.view(target.eval('self'))}"
|
54
58
|
puts "Nesting level: #{nesting.level}"
|
55
|
-
puts "Local variables: #{Pry.view(
|
59
|
+
puts "Local variables: #{target.eval('Pry.view(local_variables)')}"
|
56
60
|
puts "Last result: #{Pry.view(Pry.last_result)}"
|
57
61
|
end
|
58
62
|
|
63
|
+
def ls(target)
|
64
|
+
puts "#{target.eval('Pry.view(local_variables + instance_variables)')}"
|
65
|
+
end
|
66
|
+
|
67
|
+
def show_method(code)
|
68
|
+
code.display
|
69
|
+
end
|
70
|
+
|
59
71
|
def warn_already_at_level(nesting_level)
|
60
72
|
puts "Already at nesting level #{nesting_level}"
|
61
73
|
end
|
data/lib/pry/version.rb
CHANGED
metadata
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
4
|
+
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
version: 0.2.
|
8
|
+
- 6
|
9
|
+
version: 0.2.6
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- John Mair (banisterfiend)
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-12-
|
17
|
+
date: 2010-12-17 00:00:00 +13:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -32,6 +32,21 @@ dependencies:
|
|
32
32
|
version: 2.0.5
|
33
33
|
type: :runtime
|
34
34
|
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: method_source
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
- 1
|
46
|
+
- 4
|
47
|
+
version: 0.1.4
|
48
|
+
type: :runtime
|
49
|
+
version_requirements: *id002
|
35
50
|
description: attach an irb-like session to any object at runtime
|
36
51
|
email: jrmair@gmail.com
|
37
52
|
executables: []
|
@@ -68,13 +83,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
68
83
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
84
|
none: false
|
70
85
|
requirements:
|
71
|
-
- - "
|
86
|
+
- - ">="
|
72
87
|
- !ruby/object:Gem::Version
|
73
88
|
segments:
|
74
|
-
-
|
75
|
-
|
76
|
-
- 1
|
77
|
-
version: 1.3.1
|
89
|
+
- 0
|
90
|
+
version: "0"
|
78
91
|
requirements: []
|
79
92
|
|
80
93
|
rubyforge_project:
|