diff options
author | John Mair <jrmair@gmail.com> | 2011-03-06 03:17:54 +1300 |
---|---|---|
committer | John Mair <jrmair@gmail.com> | 2011-03-06 03:17:54 +1300 |
commit | 4b9198d03c4ebd989cdc1861576904b65e3573da (patch) | |
tree | d40826e3f1f1001791eed01853d321d2b8d27188 | |
parent | 1b65cf19d57ece58c5a86a713c01f206ccfe66d6 (diff) | |
download | pry-4b9198d03c4ebd989cdc1861576904b65e3573da.tar.gz |
version 0.6.8, added whereami command, made .pryrc run at the start of each runtime session, put syntax highlighting on by defaultv0.6.8
-rw-r--r-- | CHANGELOG | 5 | ||||
-rw-r--r-- | README.markdown | 13 | ||||
-rw-r--r-- | Rakefile | 2 | ||||
-rw-r--r-- | bin/pry | 4 | ||||
-rw-r--r-- | examples/example_hooks.rb | 4 | ||||
-rw-r--r-- | lib/pry/commands.rb | 48 | ||||
-rw-r--r-- | lib/pry/hooks.rb | 15 | ||||
-rw-r--r-- | lib/pry/pry_class.rb | 11 | ||||
-rw-r--r-- | lib/pry/pry_instance.rb | 6 | ||||
-rw-r--r-- | lib/pry/version.rb | 2 | ||||
-rw-r--r-- | test/test.rb | 41 | ||||
-rw-r--r-- | test/test_helper.rb | 8 | ||||
-rw-r--r-- | test/testrc | 2 |
13 files changed, 131 insertions, 30 deletions
@@ -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 diff --git a/README.markdown b/README.markdown index f269841e..d76f219a 100644 --- a/README.markdown +++ b/README.markdown @@ -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 -------------------- @@ -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 @@ -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 diff --git a/examples/example_hooks.rb b/examples/example_hooks.rb index a5789c63..132b1ea1 100644 --- a/examples/example_hooks.rb +++ b/examples/example_hooks.rb @@ -4,8 +4,8 @@ require 'rubygems' 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 diff --git a/lib/pry/commands.rb b/lib/pry/commands.rb index 094999bc..cb8ce1e6 100644 --- a/lib/pry/commands.rb +++ b/lib/pry/commands.rb @@ -28,19 +28,40 @@ class Pry 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 Pry 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 @@ Shows local and instance variables by default. next end - contents = File.read(file_name) + contents = File.read(File.expand_path(file_name)) output.puts contents contents end @@ -318,10 +340,10 @@ e.g: eval-file -c self "hello.rb" 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 diff --git a/lib/pry/hooks.rb b/lib/pry/hooks.rb index 436da9c2..8a3f6d36 100644 --- a/lib/pry/hooks.rb +++ b/lib/pry/hooks.rb @@ -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 diff --git a/lib/pry/pry_class.rb b/lib/pry/pry_class.rb index 525a88b4..bd4faa6f 100644 --- a/lib/pry/pry_class.rb +++ b/lib/pry/pry_class.rb @@ -1,6 +1,7 @@ # @author John Mair (banisterfiend) class Pry + # The RC Files to load. RC_FILES = ["~/.pryrc"] # class accessors @@ -151,13 +152,15 @@ class Pry 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 @@ class Pry @prompt = DEFAULT_PROMPT @print = DEFAULT_PRINT @hooks = DEFAULT_HOOKS - @color = false + @color = true @should_load_rc = true @rc_loaded = false @cli = false diff --git a/lib/pry/pry_instance.rb b/lib/pry/pry_instance.rb index 4b7a75ab..07456097 100644 --- a/lib/pry/pry_instance.rb +++ b/lib/pry/pry_instance.rb @@ -73,7 +73,7 @@ class Pry 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 @@ class Pry 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 @@ class Pry 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 diff --git a/lib/pry/version.rb b/lib/pry/version.rb index 4921bced..dc289a5a 100644 --- a/lib/pry/version.rb +++ b/lib/pry/version.rb @@ -1,3 +1,3 @@ class Pry - VERSION = "0.6.8pre6" + VERSION = "0.6.8" end diff --git a/test/test.rb b/test/test.rb index 88c909e9..8dc41f16 100644 --- a/test/test.rb +++ b/test/test.rb @@ -12,6 +12,8 @@ puts "--" # 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 @@ describe Pry do 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 @@ describe Pry do 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 @@ describe Pry do 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 @@ describe Pry do Object.remove_const(:Command3) Pry.reset_defaults + Pry.color = false end end @@ -677,6 +717,7 @@ describe Pry do str_output.string.should =~ /CLOSE/ Pry.reset_defaults + Pry.color = false end end end diff --git a/test/test_helper.rb b/test/test_helper.rb index c1a98076..dd48c466 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -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 diff --git a/test/testrc b/test/testrc new file mode 100644 index 00000000..c1045c0e --- /dev/null +++ b/test/testrc @@ -0,0 +1,2 @@ +TEST_RC = [] if !Object.const_defined?(:TEST_RC) +TEST_RC << 0 |