mirror of
https://github.com/pry/pry.git
synced 2022-11-09 12:35:05 -05:00
rescuing SyntaxError as well in valid_expression?
This commit is contained in:
parent
ed56b42dd9
commit
890ca85030
5 changed files with 64 additions and 23 deletions
|
@ -1,3 +1,5 @@
|
||||||
|
8/12/2010 version 0.1.2
|
||||||
|
* now rescuing SyntaxError as well as Racc::Parser error in valid_expression?
|
||||||
8/12/2010 version 0.1.0
|
8/12/2010 version 0.1.0
|
||||||
* release!
|
* release!
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ Pry
|
||||||
|
|
||||||
(C) John Mair (banisterfiend) 2010
|
(C) John Mair (banisterfiend) 2010
|
||||||
|
|
||||||
_attach an irb-like session to any object_
|
_attach an irb-like session to any object at runtime_
|
||||||
|
|
||||||
Pry is a simple Ruby REPL that specializes in the interactive
|
Pry is a simple Ruby REPL that specializes in the interactive
|
||||||
manipulation of objects during the running of a program.
|
manipulation of objects during the running of a program.
|
||||||
|
@ -17,7 +17,7 @@ example: prying on an object at runtime
|
||||||
|
|
||||||
With the `Pry.into()` method we can pry (open an irb-like session) on
|
With the `Pry.into()` method we can pry (open an irb-like session) on
|
||||||
an object. In the example below we open a Pry session for the `Test` class and execute a method and add
|
an object. In the example below we open a Pry session for the `Test` class and execute a method and add
|
||||||
an instance variable. The program is halted for the duration of the session.
|
an instance variable. The current thread is halted for the duration of the session.
|
||||||
|
|
||||||
require 'pry'
|
require 'pry'
|
||||||
|
|
||||||
|
@ -73,19 +73,6 @@ an instance variable inside that class:
|
||||||
Ending Pry session for Hello
|
Ending Pry session for Hello
|
||||||
pry(main)> exit
|
pry(main)> exit
|
||||||
Ending Pry session for main
|
Ending Pry session for main
|
||||||
|
|
||||||
# program resumes here
|
|
||||||
|
|
||||||
|
|
||||||
example: Spawn a separate thread so you can use `Pry` to manipulate an
|
|
||||||
object without halting the program.
|
|
||||||
---------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
If we embed our `Pry.into` method inside its own thread we can examine
|
|
||||||
and manipulate objects without halting the program.
|
|
||||||
|
|
||||||
# Pry.into() without parameters opens up the top-level (main)
|
|
||||||
Thread.new { Pry.into }
|
|
||||||
|
|
||||||
|
|
||||||
Features and limitations
|
Features and limitations
|
||||||
|
@ -123,6 +110,38 @@ Limitations:
|
||||||
hash literal syntax (this: syntax) or the 'stabby lambda' syntax
|
hash literal syntax (this: syntax) or the 'stabby lambda' syntax
|
||||||
(->).
|
(->).
|
||||||
|
|
||||||
|
Commands
|
||||||
|
-----------
|
||||||
|
|
||||||
|
The Pry API:
|
||||||
|
|
||||||
|
* `Pry.into()` and `Pry.start()` and `Pry.repl()` are all aliases of
|
||||||
|
oneanother. They all start a Read-Eval-Print-Loop on the object they
|
||||||
|
receive as a parameter. In the case of no parameter they operate on
|
||||||
|
top-level (main). They can receive any object or a `Binding`
|
||||||
|
object as parameter.
|
||||||
|
* If, for some reason you do not want to 'loop' then use `Pry.rep()`; it
|
||||||
|
only performs the Read-Eval-Print section of the REPL - it ends the
|
||||||
|
session after just one line of input. It takes the same parameters as
|
||||||
|
`Pry.repl()`
|
||||||
|
* Likewise `Pry.re()` only performs the Read-Eval section of the REPL,
|
||||||
|
it returns the result of the evaluation. It also takes the same parameters as `Pry.repl()`
|
||||||
|
* Similarly `Pry.r()` only performs the Read section of the REPL, only
|
||||||
|
returning the Ruby expression (as a string) or an Exception object in
|
||||||
|
case of error. It takes the same parameters as all the others.
|
||||||
|
|
||||||
|
Pry supports a few commands inside the session itself:
|
||||||
|
|
||||||
|
* Typing `!` on a line by itself will refresh the REPL - useful for
|
||||||
|
getting you out of a situation if the parsing process
|
||||||
|
goes wrong.
|
||||||
|
* `exit` or `quit` will end the current Pry session. Note that it will
|
||||||
|
not end any containing Pry sessions if the current session happens
|
||||||
|
to be nested.
|
||||||
|
* `#exit` or `#quit` will end the currently running program.
|
||||||
|
* You can type `Pry.into(obj)` to nest another Pry session within the
|
||||||
|
current one with `obj` as the receiver of the new session. Very useful
|
||||||
|
when exploring large or complicated runtime state.
|
||||||
|
|
||||||
Contact
|
Contact
|
||||||
-------
|
-------
|
||||||
|
|
2
Rakefile
2
Rakefile
|
@ -12,7 +12,7 @@ CLEAN.include("ext/**/*.#{dlext}", "ext/**/*.log", "ext/**/*.o",
|
||||||
|
|
||||||
def apply_spec_defaults(s)
|
def apply_spec_defaults(s)
|
||||||
s.name = "pry"
|
s.name = "pry"
|
||||||
s.summary = "Open an irb-like session on any object"
|
s.summary = "attach an irb-like session to any object at runtime"
|
||||||
s.version = Pry::VERSION
|
s.version = Pry::VERSION
|
||||||
s.date = Time.now.strftime '%Y-%m-%d'
|
s.date = Time.now.strftime '%Y-%m-%d'
|
||||||
s.author = "John Mair (banisterfiend)"
|
s.author = "John Mair (banisterfiend)"
|
||||||
|
|
32
lib/pry.rb
32
lib/pry.rb
|
@ -1,6 +1,12 @@
|
||||||
|
# (C) John Mair (banisterfiend) 2010
|
||||||
|
# MIT License
|
||||||
|
|
||||||
|
direc = File.dirname(__FILE__)
|
||||||
|
|
||||||
require 'rubygems'
|
require 'rubygems'
|
||||||
require 'readline'
|
require 'readline'
|
||||||
require 'ruby_parser'
|
require 'ruby_parser'
|
||||||
|
require "#{direc}/pry/version"
|
||||||
|
|
||||||
module Pry
|
module Pry
|
||||||
class << self
|
class << self
|
||||||
|
@ -12,22 +18,28 @@ module Pry
|
||||||
@wait_prompt = proc { |v| "pry(#{v})* " }
|
@wait_prompt = proc { |v| "pry(#{v})* " }
|
||||||
@session_start_msg = proc { |v| "Beginning Pry session for #{v}" }
|
@session_start_msg = proc { |v| "Beginning Pry session for #{v}" }
|
||||||
@session_end_msg = proc { |v| "Ending Pry session for #{v}" }
|
@session_end_msg = proc { |v| "Ending Pry session for #{v}" }
|
||||||
|
|
||||||
|
# useful for ending all Pry sessions currently active
|
||||||
|
@dead = false
|
||||||
|
|
||||||
# loop
|
# loop
|
||||||
def self.repl(target=TOPLEVEL_BINDING)
|
def self.repl(target=TOPLEVEL_BINDING)
|
||||||
if !target.is_a?(Binding)
|
if !target.is_a?(Binding)
|
||||||
target = target.instance_eval { binding }
|
target = target.instance_eval { binding }
|
||||||
end
|
end
|
||||||
|
|
||||||
puts session_start_msg.call(target.eval('self'))
|
target_self = target.eval('self')
|
||||||
|
puts session_start_msg.call(target_self)
|
||||||
|
|
||||||
loop do
|
loop do
|
||||||
if catch(:pop) { rep(target) } == :return
|
if catch(:pop) { rep(target) } == :return || @dead
|
||||||
break target.eval('self')
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
puts session_end_msg.call(target.eval('self'))
|
puts session_end_msg.call(target_self)
|
||||||
|
|
||||||
|
target_self
|
||||||
end
|
end
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
|
@ -93,9 +105,17 @@ module Pry
|
||||||
|
|
||||||
def self.valid_expression?(code)
|
def self.valid_expression?(code)
|
||||||
RubyParser.new.parse(code)
|
RubyParser.new.parse(code)
|
||||||
rescue Racc::ParseError
|
rescue Racc::ParseError, SyntaxError
|
||||||
false
|
false
|
||||||
else
|
else
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.kill
|
||||||
|
@dead = true
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.revive
|
||||||
|
@dead = false
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
module Pry
|
module Pry
|
||||||
VERSION = "0.1.0"
|
VERSION = "0.1.2"
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue