Permalink
Browse files

rescuing SyntaxError as well in valid_expression?

  • Loading branch information...
1 parent ed56b42 commit 890ca85030c395a1b4e8cbc1dad8587a4bf0438c @banister banister committed Dec 8, 2010
Showing with 64 additions and 23 deletions.
  1. +2 −0 CHANGELOG
  2. +34 −15 README.markdown
  3. +1 −1 Rakefile
  4. +26 −6 lib/pry.rb
  5. +1 −1 lib/pry/version.rb
View
@@ -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
* release!
View
@@ -3,7 +3,7 @@ Pry
(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
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
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'
@@ -73,19 +73,6 @@ an instance variable inside that class:
Ending Pry session for Hello
pry(main)> exit
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
@@ -123,6 +110,38 @@ Limitations:
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
-------
View
@@ -12,7 +12,7 @@ CLEAN.include("ext/**/*.#{dlext}", "ext/**/*.log", "ext/**/*.o",
def apply_spec_defaults(s)
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.date = Time.now.strftime '%Y-%m-%d'
s.author = "John Mair (banisterfiend)"
View
@@ -1,6 +1,12 @@
+# (C) John Mair (banisterfiend) 2010
+# MIT License
+
+direc = File.dirname(__FILE__)
+
require 'rubygems'
require 'readline'
require 'ruby_parser'
+require "#{direc}/pry/version"
module Pry
class << self
@@ -12,22 +18,28 @@ class << self
@wait_prompt = proc { |v| "pry(#{v})* " }
@session_start_msg = proc { |v| "Beginning 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
def self.repl(target=TOPLEVEL_BINDING)
if !target.is_a?(Binding)
target = target.instance_eval { binding }
end
-
- puts session_start_msg.call(target.eval('self'))
+
+ target_self = target.eval('self')
+ puts session_start_msg.call(target_self)
loop do
- if catch(:pop) { rep(target) } == :return
- break target.eval('self')
+ if catch(:pop) { rep(target) } == :return || @dead
+ break
end
end
- puts session_end_msg.call(target.eval('self'))
+ puts session_end_msg.call(target_self)
+
+ target_self
end
class << self
@@ -93,9 +105,17 @@ def self.prompt(eval_string, target)
def self.valid_expression?(code)
RubyParser.new.parse(code)
- rescue Racc::ParseError
+ rescue Racc::ParseError, SyntaxError
false
else
true
end
+
+ def self.kill
+ @dead = true
+ end
+
+ def self.revive
+ @dead = false
+ end
end
View
@@ -1,3 +1,3 @@
module Pry
- VERSION = "0.1.0"
+ VERSION = "0.1.2"
end

0 comments on commit 890ca85

Please sign in to comment.