Permalink
Browse files

version 0.6.8, added whereami command, made .pryrc run at the start o…

…f each runtime session, put syntax highlighting on by default
  • Loading branch information...
1 parent 1b65cf1 commit 4b9198d03c4ebd989cdc1861576904b65e3573da @banister banister committed Mar 5, 2011
Showing with 131 additions and 30 deletions.
  1. +5 −0 CHANGELOG
  2. +11 −2 README.markdown
  3. +1 −1 Rakefile
  4. +2 −2 bin/pry
  5. +2 −2 examples/example_hooks.rb
  6. +35 −13 lib/pry/commands.rb
  7. +13 −2 lib/pry/hooks.rb
  8. +7 −4 lib/pry/pry_class.rb
  9. +3 −3 lib/pry/pry_instance.rb
  10. +1 −1 lib/pry/version.rb
  11. +41 −0 test/test.rb
  12. +8 −0 test/test_helper.rb
  13. +2 −0 test/testrc
View
@@ -1,3 +1,8 @@
+6/3/2011 version 0.6.8
+* add whereami command, a la the `ir_b` gem
+* make whereami run at the start of every session
+* make .pryrc be loaded by run-time pry sessions
+
4/3/2011 version 0.6.7
* color support
* --simple-prompt for pry commandline
View
@@ -42,7 +42,7 @@ Example: Interacting with an object at runtime
With the `Object#pry` 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 current thread is halted for the duration of the session.
+an instance variable. The current thread is taken over by the Pry REPL loop for the duration of the session.
require 'pry'
@@ -164,7 +164,7 @@ end.
* Pry can be invoked at any time and on any object in the running program.
* Pry sessions can nest arbitrarily deeply -- to go back one level of nesting type 'exit' or 'quit' or 'back'
-* Pry comes with syntax highlighting just use the `toggle-color` command to use it.
+* Pry comes with syntax highlighting on by default just use the `toggle-color` command to use it.
* Use `_` to recover last result.
* Use `_pry_` to reference the Pry instance managing the current session.
* Pry supports tab completion.
@@ -240,6 +240,7 @@ If you want to access a method of the same name, prefix the invocation by whites
getting you out of a situation where the parsing process
goes wrong and you get stuck in an endless read loop.
* `status` shows status information about the current session.
+* `whereami` shows the code context of the session.
* `version` Show Pry version information
* `help` shows the list of session commands with brief explanations.
* `toggle-color` turns on and off syntax highlighting.
@@ -265,6 +266,14 @@ If you want to access a method of the same name, prefix the invocation by whites
current one with `obj` as the receiver of the new session. Very useful
when exploring large or complicated runtime state.
+Syntax Highlighting
+--------------------
+
+Syntax highlighting is on by default in Pry. You can toggle it on and
+off in a session by using the `toggle-color` command. Alternatively,
+you can turn it off permanently by putting the line `Pry.color =
+false` in your `~/.pryrc` file.
+
Bindings and objects
--------------------
View
@@ -26,7 +26,7 @@ def apply_spec_defaults(s)
s.has_rdoc = 'yard'
s.executables = ["pry"]
s.files = Dir["ext/**/extconf.rb", "ext/**/*.h", "ext/**/*.c", "lib/**/*.rb", "examples/**/*.rb",
- "test/*.rb", "CHANGELOG", "LICENSE", "README.markdown", "Rakefile", ".gemtest"]
+ "test/*.rb", "test/testrc", "CHANGELOG", "LICENSE", "README.markdown", "Rakefile", ".gemtest"]
end
task :test do
View
@@ -35,8 +35,8 @@ See: `https://github.com/banister` for more information.
options[:loadrc] = false
end
- opts.on("--color", "Start session with syntax highlighting on.") do
- Pry.color = true
+ opts.on("--no-color", "Start session without syntax highlighting.") do
+ Pry.color = false
end
opts.on("--simple-prompt", "Simple prompt mode.") do
@@ -4,8 +4,8 @@
require "#{direc}/../lib/pry"
my_hooks = {
- :before_session => proc { |out, obj| out.puts "Opening #{obj}." },
- :after_session => proc { |out, obj| out.puts "Closing #{obj}." }
+ :before_session => proc { |out, target| out.puts "Opening #{target.eval('self')}." },
+ :after_session => proc { |out, target| out.puts "Closing #{target.eval('self')}." }
}
# Start a Pry session using the hooks hash defined in my_hooks
View
@@ -28,19 +28,40 @@ class Commands < CommandBase
text.split.drop(1).join(' ')
end
- command "whereami" do
- file = target.eval '__FILE__'
- ir_b_line = target.eval '__LINE__'
- puts "#{file}:#{ir_b_line}"
+ command "whereami", "Show the code context for the session." do
+ file = target.eval('__FILE__')
+ line_num = target.eval('__LINE__')
+ klass = target.eval('self.class')
+ meth_name = meth_name_from_binding.call(target)
+ if !meth_name
+ output.puts "Cannot find containing method. Did you remember to use \`binding.pry\` ?"
+ next
+ end
+
+ check_for_dynamically_defined_method.call(file)
+
+ output.puts "--\nFrom #{file} @ line #{line_num} in #{klass}##{meth_name}:\n--"
+
+ # This method inspired by http://rubygems.org/gems/ir_b
File.open(file).each_with_index do |line, index|
line_n = index + 1
- next unless line_n > (ir_b_line - 6)
- break if line_n > (ir_b_line + 5)
- if line_n == ir_b_line
- puts " =>#{line_n.to_s.rjust(3)}: #{line.chomp}"
+ next unless line_n > (line_num - 6)
+ break if line_n > (line_num + 5)
+ if line_n == line_num
+ code =" =>#{line_n.to_s.rjust(3)}: #{line.chomp}"
+ if Pry.color
+ code = CodeRay.scan(code, :ruby).term
+ end
+ output.puts code
+ code
else
- puts "#{line_n.to_s.rjust(6)}: #{line.chomp}"
+ code = "#{line_n.to_s.rjust(6)}: #{line.chomp}"
+ if Pry.color
+ code = CodeRay.scan(code, :ruby).term
+ end
+ output.puts code
+ code
end
end
end
@@ -54,11 +75,12 @@ class Commands < CommandBase
Pry.start(target)
end
- command "exit-program", "End the current program. Aliases: quit-program" do
+ command "exit-program", "End the current program. Aliases: quit-program, !!!" do
exit
end
alias_command "quit-program", "exit-program", ""
+ alias_command "!!!", "exit-program", ""
command "toggle-color", "Toggle syntax highlighting." do
Pry.color = !Pry.color
@@ -279,7 +301,7 @@ class Commands < CommandBase
next
end
- contents = File.read(file_name)
+ contents = File.read(File.expand_path(file_name))
output.puts contents
contents
end
@@ -318,10 +340,10 @@ class Commands < CommandBase
old_constants = Object.constants
if options[:c]
target_self = target.eval('self')
- target.eval(File.read(file_name))
+ target.eval(File.read(File.expand_path(file_name)))
output.puts "--\nEval'd '#{file_name}' in the `#{target_self}` context."
else
- TOPLEVEL_BINDING.eval(File.read(file_name))
+ TOPLEVEL_BINDING.eval(File.read(File.expand_path(file_name)))
output.puts "--\nEval'd '#{file_name}' at top-level."
end
new_constants = Object.constants - old_constants
View
@@ -2,7 +2,18 @@ class Pry
# The default hooks - display messages when beginning and ending Pry sessions.
DEFAULT_HOOKS = {
- :before_session => proc { |out, obj| out.puts "Beginning Pry session for #{Pry.view_clip(obj)}" },
- :after_session => proc { |out, obj| out.puts "Ending Pry session for #{Pry.view_clip(obj)}" }
+
+ :before_session => proc do |out, target|
+ out.puts "Beginning Pry session for #{Pry.view_clip(target.eval('self'))}"
+
+ # ensure we're actually in a method
+ meth_name = target.eval('__method__')
+ file = target.eval('__FILE__')
+ if ![nil, :__binding__, :__binding_impl__].include?(meth_name) && file !~ /(\(.*\))|<.*>/
+ Pry.run_command "whereami", :output => out, :show_output => true, :context => target, :commands => Pry::Commands
+ end
+ end,
+
+ :after_session => proc { |out, target| out.puts "Ending Pry session for #{Pry.view_clip(target.eval('self'))}" }
}
end
View
@@ -1,6 +1,7 @@
# @author John Mair (banisterfiend)
class Pry
+ # The RC Files to load.
RC_FILES = ["~/.pryrc"]
# class accessors
@@ -151,13 +152,15 @@ def self.run_command(arg_string, options={})
options = {
:context => TOPLEVEL_BINDING,
- :show_output => false
+ :show_output => false,
+ :output => Pry.output,
+ :commands => Pry.commands
}.merge!(options)
null_output = Object.new.tap { |v| v.instance_eval { def puts(*) end } }
- commands = Pry.commands.clone
- commands.output = options[:show_output] ? Pry.output : null_output
+ commands = options[:commands].clone
+ commands.output = options[:show_output] ? options[:output] : null_output
commands.target = Pry.binding_for(options[:context])
cmd = commands.commands[name]
@@ -177,7 +180,7 @@ def self.reset_defaults
@prompt = DEFAULT_PROMPT
@print = DEFAULT_PRINT
@hooks = DEFAULT_HOOKS
- @color = false
+ @color = true
@should_load_rc = true
@rc_loaded = false
@cli = false
View
@@ -73,7 +73,7 @@ def repl(target=TOPLEVEL_BINDING)
target = Pry.binding_for(target)
target_self = target.eval('self')
- exec_hook :before_session, output, target_self
+ exec_hook :before_session, output, target
# cannot rely on nesting.level as
# nesting.level changes with new sessions
@@ -94,7 +94,7 @@ def repl(target=TOPLEVEL_BINDING)
nesting.pop
- exec_hook :after_session, output, target_self
+ exec_hook :after_session, output, target
# If break_data is an array, then the last element is the return value
break_level, return_value = Array(break_data)
@@ -136,7 +136,7 @@ def re(target=TOPLEVEL_BINDING)
end
# eval the expression and save to last_result
- Pry.last_result = target.eval r(target)
+ Pry.last_result = target.eval r(target), __FILE__, __LINE__
# save the pry instance to active_instance
Pry.active_instance = self
View
@@ -1,3 +1,3 @@
class Pry
- VERSION = "0.6.8pre6"
+ VERSION = "0.6.8"
end
View
@@ -12,6 +12,8 @@
# Ensure we do not execute any rc files
Pry::RC_FILES.clear
+Pry.color = false
+Pry.should_load_rc = false
describe Pry do
describe "open a Pry session on an object" do
@@ -85,9 +87,43 @@ class Hello
end
end
+ describe "test loading rc files" do
+ after do
+ Pry::RC_FILES.clear
+ Pry.should_load_rc = false
+ end
+
+ it "should run the rc file only once" do
+ Pry.should_load_rc = true
+ Pry::RC_FILES << "#{direc}/testrc"
+
+ Pry.start(self, :input => StringIO.new("exit\n"), :output => Pry::NullOutput)
+ TEST_RC.should == [0]
+
+ Pry.start(self, :input => StringIO.new("exit\n"), :output => Pry::NullOutput)
+ TEST_RC.should == [0]
+
+ Object.remove_const(:TEST_RC)
+ end
+
+ it "should not run the rc file at all if Pry.should_load_rc is false" do
+ Pry.should_load_rc = false
+ Pry.start(self, :input => StringIO.new("exit\n"), :output => Pry::NullOutput)
+ Object.const_defined?(:TEST_RC).should == false
+ end
+
+ it "should not load the rc file if #repl method invoked" do
+ Pry.should_load_rc = true
+ Pry.new(:input => StringIO.new("exit\n"), :output => Pry::NullOutput).repl(self)
+ Object.const_defined?(:TEST_RC).should == false
+ Pry.should_load_rc = false
+ end
+ end
+
describe "nesting" do
after do
Pry.reset_defaults
+ Pry.color = false
end
it 'should nest properly' do
@@ -174,6 +210,7 @@ class Hello
after do
Pry.reset_defaults
+ Pry.color = false
end
it "should start a pry session on the receiver (first form)" do
@@ -217,12 +254,14 @@ class Hello
after do
Pry.reset_defaults
+ Pry.color = false
end
describe "input" do
after do
Pry.reset_defaults
+ Pry.color = false
end
it 'should set the input default, and the default should be overridable' do
@@ -545,6 +584,7 @@ class Command3 < Pry::Commands
Object.remove_const(:Command3)
Pry.reset_defaults
+ Pry.color = false
end
end
@@ -677,6 +717,7 @@ class Command3 < Pry::Commands
str_output.string.should =~ /CLOSE/
Pry.reset_defaults
+ Pry.color = false
end
end
end
View
@@ -2,6 +2,14 @@ class Module
public :remove_const
end
+class << Pry
+ alias_method :orig_reset_defaults, :reset_defaults
+ def reset_defaults
+ orig_reset_defaults
+ Pry.color = false
+ end
+end
+
class InputTester
def initialize(*actions)
@orig_actions = actions.dup
View
@@ -0,0 +1,2 @@
+TEST_RC = [] if !Object.const_defined?(:TEST_RC)
+TEST_RC << 0

0 comments on commit 4b9198d

Please sign in to comment.