pry 0.9.11.4-i386-mswin32 → 0.9.12-i386-mswin32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.travis.yml +2 -0
 - data/CHANGELOG +19 -0
 - data/Rakefile +4 -0
 - data/lib/pry.rb +1 -1
 - data/lib/pry/cli.rb +14 -8
 - data/lib/pry/code.rb +3 -3
 - data/lib/pry/command.rb +20 -5
 - data/lib/pry/command_set.rb +3 -3
 - data/lib/pry/commands.rb +1 -1
 - data/lib/pry/commands/disabled_commands.rb +2 -0
 - data/lib/pry/commands/ls.rb +1 -2
 - data/lib/pry/commands/reload_code.rb +8 -1
 - data/lib/pry/commands/show_info.rb +66 -5
 - data/lib/pry/commands/show_source.rb +2 -1
 - data/lib/pry/commands/whereami.rb +87 -19
 - data/lib/pry/completion.rb +13 -4
 - data/lib/pry/helpers/base_helpers.rb +5 -2
 - data/lib/pry/helpers/command_helpers.rb +3 -1
 - data/lib/pry/helpers/documentation_helpers.rb +18 -7
 - data/lib/pry/helpers/table.rb +4 -4
 - data/lib/pry/indent.rb +2 -7
 - data/lib/pry/method.rb +89 -129
 - data/lib/pry/method/disowned.rb +53 -0
 - data/lib/pry/method/weird_method_locator.rb +186 -0
 - data/lib/pry/module_candidate.rb +13 -8
 - data/lib/pry/pager.rb +12 -11
 - data/lib/pry/plugins.rb +2 -0
 - data/lib/pry/pry_class.rb +19 -3
 - data/lib/pry/pry_instance.rb +3 -0
 - data/lib/pry/terminal.rb +78 -0
 - data/lib/pry/version.rb +1 -1
 - data/lib/pry/wrapped_module.rb +63 -1
 - data/spec/Procfile +3 -0
 - data/spec/command_helpers_spec.rb +21 -1
 - data/spec/commands/ls_spec.rb +4 -0
 - data/spec/commands/show_doc_spec.rb +255 -123
 - data/spec/commands/show_source_spec.rb +421 -236
 - data/spec/commands/whereami_spec.rb +60 -11
 - data/spec/completion_spec.rb +6 -0
 - data/spec/documentation_helper_spec.rb +73 -0
 - data/spec/fixtures/whereami_helper.rb +6 -0
 - data/spec/helpers/table_spec.rb +19 -0
 - data/spec/method_spec.rb +24 -7
 - metadata +12 -5
 - data/.gemtest +0 -0
 - data/lib/pry/commands/deprecated_commands.rb +0 -2
 - data/lib/pry/terminal_info.rb +0 -48
 
    
        data/lib/pry/completion.rb
    CHANGED
    
    | 
         @@ -71,9 +71,18 @@ class Pry 
     | 
|
| 
       71 
71 
     | 
    
         
             
                    # get new target for 1/2 and find candidates for 3
         
     | 
| 
       72 
72 
     | 
    
         
             
                    path, input = build_path(input)
         
     | 
| 
       73 
73 
     | 
    
         | 
| 
       74 
     | 
    
         
            -
                     
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
       76 
     | 
    
         
            -
             
     | 
| 
      
 74 
     | 
    
         
            +
                    # We silence warnings here or Ruby 1.8 cries about "multiple values for
         
     | 
| 
      
 75 
     | 
    
         
            +
                    # block 0 for 1".
         
     | 
| 
      
 76 
     | 
    
         
            +
                    Helpers::BaseHelpers.silence_warnings do
         
     | 
| 
      
 77 
     | 
    
         
            +
                      unless path.call.empty?
         
     | 
| 
      
 78 
     | 
    
         
            +
                        target = begin
         
     | 
| 
      
 79 
     | 
    
         
            +
                          ctx = Helpers::BaseHelpers.context_from_object_path(path.call, pry)
         
     | 
| 
      
 80 
     | 
    
         
            +
                          ctx.first
         
     | 
| 
      
 81 
     | 
    
         
            +
                        rescue Pry::CommandError
         
     | 
| 
      
 82 
     | 
    
         
            +
                          []
         
     | 
| 
      
 83 
     | 
    
         
            +
                        end
         
     | 
| 
      
 84 
     | 
    
         
            +
                        target = target.last
         
     | 
| 
      
 85 
     | 
    
         
            +
                      end
         
     | 
| 
       77 
86 
     | 
    
         
             
                    end
         
     | 
| 
       78 
87 
     | 
    
         | 
| 
       79 
88 
     | 
    
         
             
                    begin
         
     | 
| 
         @@ -283,7 +292,7 @@ class Pry 
     | 
|
| 
       283 
292 
     | 
    
         
             
                  contexts = input.chomp('/').split(/\//)
         
     | 
| 
       284 
293 
     | 
    
         
             
                  input = contexts[-1]
         
     | 
| 
       285 
294 
     | 
    
         | 
| 
       286 
     | 
    
         
            -
                  path =  
     | 
| 
      
 295 
     | 
    
         
            +
                  path = Proc.new do |input|
         
     | 
| 
       287 
296 
     | 
    
         
             
                    p = contexts[0..-2].push(input).join('/')
         
     | 
| 
       288 
297 
     | 
    
         
             
                    p += '/' if trailing_slash && !input.nil?
         
     | 
| 
       289 
298 
     | 
    
         
             
                    p
         
     | 
| 
         @@ -83,12 +83,15 @@ class Pry 
     | 
|
| 
       83 
83 
     | 
    
         
             
                    defined?(Win32::Console) || ENV['ANSICON']
         
     | 
| 
       84 
84 
     | 
    
         
             
                  end
         
     | 
| 
       85 
85 
     | 
    
         | 
| 
       86 
     | 
    
         
            -
                  # are we on Jruby platform?
         
     | 
| 
       87 
86 
     | 
    
         
             
                  def jruby?
         
     | 
| 
       88 
87 
     | 
    
         
             
                    RbConfig::CONFIG['ruby_install_name'] == 'jruby'
         
     | 
| 
       89 
88 
     | 
    
         
             
                  end
         
     | 
| 
       90 
89 
     | 
    
         | 
| 
       91 
     | 
    
         
            -
                   
     | 
| 
      
 90 
     | 
    
         
            +
                  def jruby_19?
         
     | 
| 
      
 91 
     | 
    
         
            +
                    RbConfig::CONFIG['ruby_install_name'] == 'jruby' &&
         
     | 
| 
      
 92 
     | 
    
         
            +
                      RbConfig::CONFIG['ruby_version'] == '1.9'
         
     | 
| 
      
 93 
     | 
    
         
            +
                  end
         
     | 
| 
      
 94 
     | 
    
         
            +
             
     | 
| 
       92 
95 
     | 
    
         
             
                  def rbx?
         
     | 
| 
       93 
96 
     | 
    
         
             
                    RbConfig::CONFIG['ruby_install_name'] == 'rbx'
         
     | 
| 
       94 
97 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -84,7 +84,9 @@ class Pry 
     | 
|
| 
       84 
84 
     | 
    
         
             
                    text = text.sub(/^[ \t]+$/, '')
         
     | 
| 
       85 
85 
     | 
    
         | 
| 
       86 
86 
     | 
    
         
             
                    # Find the longest common whitespace to all indented lines
         
     | 
| 
       87 
     | 
    
         
            -
                     
     | 
| 
      
 87 
     | 
    
         
            +
                    # Ignore lines containing just -- or ++ as these seem to be used by
         
     | 
| 
      
 88 
     | 
    
         
            +
                    # comment authors as delimeters.
         
     | 
| 
      
 89 
     | 
    
         
            +
                    margin = text.scan(/^[ \t]*(?!--\n|\+\+\n)(?=[^ \t\n])/).inject do |current_margin, next_indent|
         
     | 
| 
       88 
90 
     | 
    
         
             
                      if next_indent.start_with?(current_margin)
         
     | 
| 
       89 
91 
     | 
    
         
             
                        current_margin
         
     | 
| 
       90 
92 
     | 
    
         
             
                      elsif current_margin.start_with?(next_indent)
         
     | 
| 
         @@ -4,14 +4,18 @@ class Pry 
     | 
|
| 
       4 
4 
     | 
    
         
             
                # This class contains methods useful for extracting
         
     | 
| 
       5 
5 
     | 
    
         
             
                # documentation from methods and classes.
         
     | 
| 
       6 
6 
     | 
    
         
             
                module DocumentationHelpers
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                  module_function
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
       7 
10 
     | 
    
         
             
                  def process_rdoc(comment)
         
     | 
| 
      
 11 
     | 
    
         
            +
                    return comment unless Pry.color
         
     | 
| 
       8 
12 
     | 
    
         
             
                    comment = comment.dup
         
     | 
| 
       9 
     | 
    
         
            -
                    comment.gsub(/<code>(?:\s*\n)?(.*?)\s*<\/code>/m) {  
     | 
| 
       10 
     | 
    
         
            -
                      gsub(/<em>(?:\s*\n)?(.*?)\s*<\/em>/m) {  
     | 
| 
       11 
     | 
    
         
            -
                      gsub(/<i>(?:\s*\n)?(.*?)\s*<\/i>/m) {  
     | 
| 
       12 
     | 
    
         
            -
                      gsub(/\B\+(\w 
     | 
| 
       13 
     | 
    
         
            -
                      gsub(/((?:^[ \t]+.+(?:\n+|\Z))+)/)  {  
     | 
| 
       14 
     | 
    
         
            -
                      gsub(/`(?:\s*\n)?([^\e]*?)\s*`/) { "`#{ 
     | 
| 
      
 13 
     | 
    
         
            +
                    comment.gsub(/<code>(?:\s*\n)?(.*?)\s*<\/code>/m) { CodeRay.scan($1, :ruby).term }.
         
     | 
| 
      
 14 
     | 
    
         
            +
                      gsub(/<em>(?:\s*\n)?(.*?)\s*<\/em>/m) { "\e[1m#{$1}\e[0m" }.
         
     | 
| 
      
 15 
     | 
    
         
            +
                      gsub(/<i>(?:\s*\n)?(.*?)\s*<\/i>/m) { "\e[1m#{$1}\e[0m" }.
         
     | 
| 
      
 16 
     | 
    
         
            +
                      gsub(/\B\+(\w+?)\+\B/)  { "\e[32m#{$1}\e[0m" }.
         
     | 
| 
      
 17 
     | 
    
         
            +
                      gsub(/((?:^[ \t]+.+(?:\n+|\Z))+)/)  { CodeRay.scan($1, :ruby).term }.
         
     | 
| 
      
 18 
     | 
    
         
            +
                      gsub(/`(?:\s*\n)?([^\e]*?)\s*`/) { "`#{CodeRay.scan($1, :ruby).term}`" }
         
     | 
| 
       15 
19 
     | 
    
         
             
                  end
         
     | 
| 
       16 
20 
     | 
    
         | 
| 
       17 
21 
     | 
    
         
             
                  def process_yardoc_tag(comment, tag)
         
     | 
| 
         @@ -46,10 +50,17 @@ class Pry 
     | 
|
| 
       46 
50 
     | 
    
         
             
                    code.sub(/\A\s*\/\*.*?\*\/\s*/m, '')
         
     | 
| 
       47 
51 
     | 
    
         
             
                  end
         
     | 
| 
       48 
52 
     | 
    
         | 
| 
      
 53 
     | 
    
         
            +
                  # Given a string that makes up a comment in a source-code file parse out the content
         
     | 
| 
      
 54 
     | 
    
         
            +
                  # that the user is intended to read. (i.e. without leading indentation, #-characters
         
     | 
| 
      
 55 
     | 
    
         
            +
                  # or shebangs)
         
     | 
| 
      
 56 
     | 
    
         
            +
                  #
         
     | 
| 
       49 
57 
     | 
    
         
             
                  # @param [String] comment
         
     | 
| 
       50 
58 
     | 
    
         
             
                  # @return [String]
         
     | 
| 
       51 
     | 
    
         
            -
                  def  
     | 
| 
      
 59 
     | 
    
         
            +
                  def get_comment_content(comment)
         
     | 
| 
       52 
60 
     | 
    
         
             
                    comment = comment.dup
         
     | 
| 
      
 61 
     | 
    
         
            +
                    # Remove #!/usr/bin/ruby
         
     | 
| 
      
 62 
     | 
    
         
            +
                    comment.gsub!(/\A\#!.*$/, '')
         
     | 
| 
      
 63 
     | 
    
         
            +
                    # Remove leading empty comment lines
         
     | 
| 
       53 
64 
     | 
    
         
             
                    comment.gsub!(/\A\#+?$/, '')
         
     | 
| 
       54 
65 
     | 
    
         
             
                    comment.gsub!(/^\s*#/, '')
         
     | 
| 
       55 
66 
     | 
    
         
             
                    strip_leading_whitespace(comment)
         
     | 
    
        data/lib/pry/helpers/table.rb
    CHANGED
    
    | 
         @@ -3,7 +3,7 @@ class Pry 
     | 
|
| 
       3 
3 
     | 
    
         
             
                def self.tablify_or_one_line(heading, things)
         
     | 
| 
       4 
4 
     | 
    
         
             
                  plain_heading = Pry::Helpers::Text.strip_color(heading)
         
     | 
| 
       5 
5 
     | 
    
         
             
                  attempt = Table.new(things, :column_count => things.size)
         
     | 
| 
       6 
     | 
    
         
            -
                  if attempt.fits_on_line?( 
     | 
| 
      
 6 
     | 
    
         
            +
                  if attempt.fits_on_line?(Terminal.width! - plain_heading.size - 2)
         
     | 
| 
       7 
7 
     | 
    
         
             
                    "#{heading}: #{attempt}\n"
         
     | 
| 
       8 
8 
     | 
    
         
             
                  else
         
     | 
| 
       9 
9 
     | 
    
         
             
                    "#{heading}: \n#{tablify_to_screen_width(things, :indent => '  ')}\n"
         
     | 
| 
         @@ -13,16 +13,16 @@ class Pry 
     | 
|
| 
       13 
13 
     | 
    
         
             
                def self.tablify_to_screen_width(things, options = {})
         
     | 
| 
       14 
14 
     | 
    
         
             
                  things = things.compact
         
     | 
| 
       15 
15 
     | 
    
         
             
                  if indent = options[:indent]
         
     | 
| 
       16 
     | 
    
         
            -
                    usable_width =  
     | 
| 
      
 16 
     | 
    
         
            +
                    usable_width = Terminal.width! - indent.size
         
     | 
| 
       17 
17 
     | 
    
         
             
                    tablify(things, usable_width).to_s.gsub(/^/, indent)
         
     | 
| 
       18 
18 
     | 
    
         
             
                  else
         
     | 
| 
       19 
     | 
    
         
            -
                    tablify(things,  
     | 
| 
      
 19 
     | 
    
         
            +
                    tablify(things, Terminal.width!).to_s
         
     | 
| 
       20 
20 
     | 
    
         
             
                  end
         
     | 
| 
       21 
21 
     | 
    
         
             
                end
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
                def self.tablify(things, line_length)
         
     | 
| 
       24 
24 
     | 
    
         
             
                  table = Table.new(things, :column_count => things.size)
         
     | 
| 
       25 
     | 
    
         
            -
                  table.column_count -= 1 until  
     | 
| 
      
 25 
     | 
    
         
            +
                  table.column_count -= 1 until 1 == table.column_count or
         
     | 
| 
       26 
26 
     | 
    
         
             
                    table.fits_on_line?(line_length)
         
     | 
| 
       27 
27 
     | 
    
         
             
                  table
         
     | 
| 
       28 
28 
     | 
    
         
             
                end
         
     | 
    
        data/lib/pry/indent.rb
    CHANGED
    
    | 
         @@ -1,12 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            require 'coderay'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
3 
     | 
    
         
             
            class Pry
         
     | 
| 
       4 
     | 
    
         
            -
              # Load io-console if possible, so that we can use $stdout.winsize.
         
     | 
| 
       5 
     | 
    
         
            -
              begin
         
     | 
| 
       6 
     | 
    
         
            -
                require 'io/console'
         
     | 
| 
       7 
     | 
    
         
            -
              rescue LoadError
         
     | 
| 
       8 
     | 
    
         
            -
              end
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
4 
     | 
    
         
             
              ##
         
     | 
| 
       11 
5 
     | 
    
         
             
              # Pry::Indent is a class that can be used to indent a number of lines
         
     | 
| 
       12 
6 
     | 
    
         
             
              # containing Ruby code similar as to how IRB does it (but better). The class
         
     | 
| 
         @@ -389,10 +383,11 @@ class Pry 
     | 
|
| 
       389 
383 
     | 
    
         
             
                #   the difference in length between the old line and the new one).
         
     | 
| 
       390 
384 
     | 
    
         
             
                # @return [String]
         
     | 
| 
       391 
385 
     | 
    
         
             
                def correct_indentation(prompt, code, overhang=0)
         
     | 
| 
      
 386 
     | 
    
         
            +
                  prompt = prompt.delete("\001\002")
         
     | 
| 
       392 
387 
     | 
    
         
             
                  full_line = prompt + code
         
     | 
| 
       393 
388 
     | 
    
         
             
                  whitespace = ' ' * overhang
         
     | 
| 
       394 
389 
     | 
    
         | 
| 
       395 
     | 
    
         
            -
                  _, cols =  
     | 
| 
      
 390 
     | 
    
         
            +
                  _, cols = Terminal.screen_size
         
     | 
| 
       396 
391 
     | 
    
         | 
| 
       397 
392 
     | 
    
         
             
                  cols = cols.to_i
         
     | 
| 
       398 
393 
     | 
    
         
             
                  lines = cols != 0 ? (full_line.length / cols + 1) : 1
         
     | 
    
        data/lib/pry/method.rb
    CHANGED
    
    | 
         @@ -17,9 +17,12 @@ class Pry 
     | 
|
| 
       17 
17 
     | 
    
         
             
              # This class wraps the normal `Method` and `UnboundMethod` classes
         
     | 
| 
       18 
18 
     | 
    
         
             
              # to provide extra functionality useful to Pry.
         
     | 
| 
       19 
19 
     | 
    
         
             
              class Method
         
     | 
| 
      
 20 
     | 
    
         
            +
                require 'pry/method/weird_method_locator'
         
     | 
| 
      
 21 
     | 
    
         
            +
                require 'pry/method/disowned'
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
       20 
23 
     | 
    
         
             
                extend Helpers::BaseHelpers
         
     | 
| 
       21 
24 
     | 
    
         
             
                include Helpers::BaseHelpers
         
     | 
| 
       22 
     | 
    
         
            -
                include RbxMethod if  
     | 
| 
      
 25 
     | 
    
         
            +
                include RbxMethod if rbx?
         
     | 
| 
       23 
26 
     | 
    
         
             
                include Helpers::DocumentationHelpers
         
     | 
| 
       24 
27 
     | 
    
         
             
                include CodeObject::Helpers
         
     | 
| 
       25 
28 
     | 
    
         | 
| 
         @@ -82,37 +85,11 @@ class Pry 
     | 
|
| 
       82 
85 
     | 
    
         
             
                                 Disowned.new(b.eval('self'), meth_name.to_s)
         
     | 
| 
       83 
86 
     | 
    
         
             
                               end
         
     | 
| 
       84 
87 
     | 
    
         | 
| 
       85 
     | 
    
         
            -
                       
     | 
| 
       86 
     | 
    
         
            -
             
     | 
| 
       87 
     | 
    
         
            -
                       
     | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
       89 
     | 
    
         
            -
                      # class B < A; def b; super; end; end
         
     | 
| 
       90 
     | 
    
         
            -
                      #
         
     | 
| 
       91 
     | 
    
         
            -
                      # Given that we can normally find the source_range of methods, and that we know which
         
     | 
| 
       92 
     | 
    
         
            -
                      # __FILE__ and __LINE__ the binding is at, we can hope to disambiguate these cases.
         
     | 
| 
       93 
     | 
    
         
            -
                      #
         
     | 
| 
       94 
     | 
    
         
            -
                      # This obviously won't work if the source is unavaiable for some reason, or if both
         
     | 
| 
       95 
     | 
    
         
            -
                      # methods have the same __FILE__ and __LINE__, or if we're in rbx where b.eval('__LINE__')
         
     | 
| 
       96 
     | 
    
         
            -
                      # is broken.
         
     | 
| 
       97 
     | 
    
         
            -
                      #
         
     | 
| 
       98 
     | 
    
         
            -
                      guess = method
         
     | 
| 
       99 
     | 
    
         
            -
             
     | 
| 
       100 
     | 
    
         
            -
                      while guess
         
     | 
| 
       101 
     | 
    
         
            -
                        # needs rescue if this is a Disowned method or a C method or something...
         
     | 
| 
       102 
     | 
    
         
            -
                        # TODO: Fix up the exception handling so we don't need a bare rescue
         
     | 
| 
       103 
     | 
    
         
            -
                        if (guess.source_file && guess.source_range rescue false) &&
         
     | 
| 
       104 
     | 
    
         
            -
                            File.expand_path(guess.source_file) == File.expand_path(b.eval('__FILE__')) &&
         
     | 
| 
       105 
     | 
    
         
            -
                            guess.source_range.include?(b.eval('__LINE__'))
         
     | 
| 
       106 
     | 
    
         
            -
                          return guess
         
     | 
| 
       107 
     | 
    
         
            -
                        else
         
     | 
| 
       108 
     | 
    
         
            -
                          guess = guess.super
         
     | 
| 
       109 
     | 
    
         
            -
                        end
         
     | 
| 
      
 88 
     | 
    
         
            +
                      if WeirdMethodLocator.weird_method?(method, b)
         
     | 
| 
      
 89 
     | 
    
         
            +
                        WeirdMethodLocator.new(method, b).get_method || method
         
     | 
| 
      
 90 
     | 
    
         
            +
                      else
         
     | 
| 
      
 91 
     | 
    
         
            +
                        method
         
     | 
| 
       110 
92 
     | 
    
         
             
                      end
         
     | 
| 
       111 
     | 
    
         
            -
             
     | 
| 
       112 
     | 
    
         
            -
                      # Uhoh... none of the methods in the chain had the right __FILE__ and __LINE__
         
     | 
| 
       113 
     | 
    
         
            -
                      # This may be caused by rbx https://github.com/rubinius/rubinius/issues/953,
         
     | 
| 
       114 
     | 
    
         
            -
                      # or other unknown circumstances (TODO: we should warn the user when this happens)
         
     | 
| 
       115 
     | 
    
         
            -
                      method
         
     | 
| 
       116 
93 
     | 
    
         
             
                    end
         
     | 
| 
       117 
94 
     | 
    
         
             
                  end
         
     | 
| 
       118 
95 
     | 
    
         | 
| 
         @@ -196,6 +173,19 @@ class Pry 
     | 
|
| 
       196 
173 
     | 
    
         
             
                    ([klass] + klass.ancestors).uniq
         
     | 
| 
       197 
174 
     | 
    
         
             
                  end
         
     | 
| 
       198 
175 
     | 
    
         | 
| 
      
 176 
     | 
    
         
            +
                  def method_definition?(name, definition_line)
         
     | 
| 
      
 177 
     | 
    
         
            +
                    singleton_method_definition?(name, definition_line) ||
         
     | 
| 
      
 178 
     | 
    
         
            +
                      instance_method_definition?(name, definition_line)
         
     | 
| 
      
 179 
     | 
    
         
            +
                  end
         
     | 
| 
      
 180 
     | 
    
         
            +
             
     | 
| 
      
 181 
     | 
    
         
            +
                  def singleton_method_definition?(name, definition_line)
         
     | 
| 
      
 182 
     | 
    
         
            +
                    /^define_singleton_method\(?\s*[:\"\']#{name}|^def\s*self\.#{name}/ =~ definition_line.strip
         
     | 
| 
      
 183 
     | 
    
         
            +
                  end
         
     | 
| 
      
 184 
     | 
    
         
            +
             
     | 
| 
      
 185 
     | 
    
         
            +
                  def instance_method_definition?(name, definition_line)
         
     | 
| 
      
 186 
     | 
    
         
            +
                    /^define_method\(?\s*[:\"\']#{name}|^def\s*#{name}/ =~ definition_line.strip
         
     | 
| 
      
 187 
     | 
    
         
            +
                  end
         
     | 
| 
      
 188 
     | 
    
         
            +
             
     | 
| 
       199 
189 
     | 
    
         
             
                  private
         
     | 
| 
       200 
190 
     | 
    
         | 
| 
       201 
191 
     | 
    
         
             
                  # See all_from_class and all_from_obj.
         
     | 
| 
         @@ -310,12 +300,12 @@ class Pry 
     | 
|
| 
       310 
300 
     | 
    
         
             
                      info = pry_doc_info
         
     | 
| 
       311 
301 
     | 
    
         
             
                      info.docstring if info
         
     | 
| 
       312 
302 
     | 
    
         
             
                    when :ruby
         
     | 
| 
       313 
     | 
    
         
            -
                      if  
     | 
| 
       314 
     | 
    
         
            -
                         
     | 
| 
      
 303 
     | 
    
         
            +
                      if rbx? && !pry_method?
         
     | 
| 
      
 304 
     | 
    
         
            +
                        get_comment_content(core_doc)
         
     | 
| 
       315 
305 
     | 
    
         
             
                      elsif pry_method?
         
     | 
| 
       316 
     | 
    
         
            -
                         
     | 
| 
      
 306 
     | 
    
         
            +
                        get_comment_content(doc_for_pry_method)
         
     | 
| 
       317 
307 
     | 
    
         
             
                      else
         
     | 
| 
       318 
     | 
    
         
            -
                         
     | 
| 
      
 308 
     | 
    
         
            +
                        get_comment_content(@method.comment)
         
     | 
| 
       319 
309 
     | 
    
         
             
                      end
         
     | 
| 
       320 
310 
     | 
    
         
             
                    end
         
     | 
| 
       321 
311 
     | 
    
         
             
                end
         
     | 
| 
         @@ -327,7 +317,7 @@ class Pry 
     | 
|
| 
       327 
317 
     | 
    
         
             
                end
         
     | 
| 
       328 
318 
     | 
    
         | 
| 
       329 
319 
     | 
    
         
             
                def source_location
         
     | 
| 
       330 
     | 
    
         
            -
                  if @method.source_location &&  
     | 
| 
      
 320 
     | 
    
         
            +
                  if @method.source_location && rbx?
         
     | 
| 
       331 
321 
     | 
    
         
             
                    file, line = @method.source_location
         
     | 
| 
       332 
322 
     | 
    
         
             
                    [RbxPath.convert_path_to_full(file), line]
         
     | 
| 
       333 
323 
     | 
    
         
             
                  else
         
     | 
| 
         @@ -339,7 +329,7 @@ class Pry 
     | 
|
| 
       339 
329 
     | 
    
         
             
                #   `nil` if the filename is unavailable.
         
     | 
| 
       340 
330 
     | 
    
         
             
                def source_file
         
     | 
| 
       341 
331 
     | 
    
         
             
                  if source_location.nil?
         
     | 
| 
       342 
     | 
    
         
            -
                    if ! 
     | 
| 
      
 332 
     | 
    
         
            +
                    if !rbx? and source_type == :c
         
     | 
| 
       343 
333 
     | 
    
         
             
                      info = pry_doc_info
         
     | 
| 
       344 
334 
     | 
    
         
             
                      info.file if info
         
     | 
| 
       345 
335 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -423,6 +413,21 @@ class Pry 
     | 
|
| 
       423 
413 
     | 
    
         
             
                  !!(source_file and source_file =~ /(\(.*\))|<.*>/)
         
     | 
| 
       424 
414 
     | 
    
         
             
                end
         
     | 
| 
       425 
415 
     | 
    
         | 
| 
      
 416 
     | 
    
         
            +
                # @return [Boolean] Whether the method is unbound.
         
     | 
| 
      
 417 
     | 
    
         
            +
                def unbound_method?
         
     | 
| 
      
 418 
     | 
    
         
            +
                  is_a?(::UnboundMethod)
         
     | 
| 
      
 419 
     | 
    
         
            +
                end
         
     | 
| 
      
 420 
     | 
    
         
            +
             
     | 
| 
      
 421 
     | 
    
         
            +
                # @return [Boolean] Whether the method is bound.
         
     | 
| 
      
 422 
     | 
    
         
            +
                def bound_method?
         
     | 
| 
      
 423 
     | 
    
         
            +
                  is_a?(::Method)
         
     | 
| 
      
 424 
     | 
    
         
            +
                end
         
     | 
| 
      
 425 
     | 
    
         
            +
             
     | 
| 
      
 426 
     | 
    
         
            +
                # @return [Boolean] Whether the method is a singleton method.
         
     | 
| 
      
 427 
     | 
    
         
            +
                def singleton_method?
         
     | 
| 
      
 428 
     | 
    
         
            +
                  wrapped_owner.singleton_class?
         
     | 
| 
      
 429 
     | 
    
         
            +
                end
         
     | 
| 
      
 430 
     | 
    
         
            +
             
     | 
| 
       426 
431 
     | 
    
         
             
                # @return [Boolean] Was the method defined within the Pry REPL?
         
     | 
| 
       427 
432 
     | 
    
         
             
                def pry_method?
         
     | 
| 
       428 
433 
     | 
    
         
             
                  source_file == Pry.eval_path
         
     | 
| 
         @@ -479,113 +484,68 @@ class Pry 
     | 
|
| 
       479 
484 
     | 
    
         
             
                end
         
     | 
| 
       480 
485 
     | 
    
         | 
| 
       481 
486 
     | 
    
         
             
                private
         
     | 
| 
       482 
     | 
    
         
            -
                  # @return [YARD::CodeObjects::MethodObject]
         
     | 
| 
       483 
     | 
    
         
            -
                  # @raise [CommandError] Raises when the method can't be found or `pry-doc` isn't installed.
         
     | 
| 
       484 
     | 
    
         
            -
                  def pry_doc_info
         
     | 
| 
       485 
     | 
    
         
            -
                    if Pry.config.has_pry_doc
         
     | 
| 
       486 
     | 
    
         
            -
                      Pry::MethodInfo.info_for(@method) or raise CommandError, "Cannot locate this method: #{name}. (source_location returns nil)"
         
     | 
| 
       487 
     | 
    
         
            -
                    else
         
     | 
| 
       488 
     | 
    
         
            -
                      raise CommandError, "Cannot locate this method: #{name}. Try `gem install pry-doc` to get access to Ruby Core documentation."
         
     | 
| 
       489 
     | 
    
         
            -
                    end
         
     | 
| 
       490 
     | 
    
         
            -
                  end
         
     | 
| 
       491 
     | 
    
         
            -
             
     | 
| 
       492 
     | 
    
         
            -
                  # FIXME: a very similar method to this exists on WrappedModule: extract_doc_for_candidate
         
     | 
| 
       493 
     | 
    
         
            -
                  def doc_for_pry_method
         
     | 
| 
       494 
     | 
    
         
            -
                    _, line_num = source_location
         
     | 
| 
       495 
     | 
    
         
            -
             
     | 
| 
       496 
     | 
    
         
            -
                    buffer = ""
         
     | 
| 
       497 
     | 
    
         
            -
                    Pry.line_buffer[0..(line_num - 1)].each do |line|
         
     | 
| 
       498 
     | 
    
         
            -
                      # Add any line that is a valid ruby comment,
         
     | 
| 
       499 
     | 
    
         
            -
                      # but clear as soon as we hit a non comment line.
         
     | 
| 
       500 
     | 
    
         
            -
                      if (line =~ /^\s*#/) || (line =~ /^\s*$/)
         
     | 
| 
       501 
     | 
    
         
            -
                        buffer << line.lstrip
         
     | 
| 
       502 
     | 
    
         
            -
                      else
         
     | 
| 
       503 
     | 
    
         
            -
                        buffer.replace("")
         
     | 
| 
       504 
     | 
    
         
            -
                      end
         
     | 
| 
       505 
     | 
    
         
            -
                    end
         
     | 
| 
       506 
487 
     | 
    
         | 
| 
       507 
     | 
    
         
            -
             
     | 
| 
       508 
     | 
    
         
            -
             
     | 
| 
       509 
     | 
    
         
            -
             
     | 
| 
       510 
     | 
    
         
            -
                   
     | 
| 
       511 
     | 
    
         
            -
             
     | 
| 
       512 
     | 
    
         
            -
                   
     | 
| 
       513 
     | 
    
         
            -
                     
     | 
| 
       514 
     | 
    
         
            -
                     
     | 
| 
       515 
     | 
    
         
            -
                       
     | 
| 
       516 
     | 
    
         
            -
                      while ancestors[i] && !(ancestors[i].method_defined?(name) || ancestors[i].private_method_defined?(name))
         
     | 
| 
       517 
     | 
    
         
            -
                        i += 1
         
     | 
| 
       518 
     | 
    
         
            -
                      end
         
     | 
| 
       519 
     | 
    
         
            -
                      next_owner = ancestors[i] or return nil
         
     | 
| 
      
 488 
     | 
    
         
            +
                # @return [YARD::CodeObjects::MethodObject]
         
     | 
| 
      
 489 
     | 
    
         
            +
                # @raise [CommandError] when the method can't be found or `pry-doc` isn't installed.
         
     | 
| 
      
 490 
     | 
    
         
            +
                def pry_doc_info
         
     | 
| 
      
 491 
     | 
    
         
            +
                  if Pry.config.has_pry_doc
         
     | 
| 
      
 492 
     | 
    
         
            +
                    Pry::MethodInfo.info_for(@method) or raise CommandError, "Cannot locate this method: #{name}. (source_location returns nil)"
         
     | 
| 
      
 493 
     | 
    
         
            +
                  else
         
     | 
| 
      
 494 
     | 
    
         
            +
                    fail_msg = "Cannot locate this method: #{name}."
         
     | 
| 
      
 495 
     | 
    
         
            +
                    if mri_18? || mri_19?
         
     | 
| 
      
 496 
     | 
    
         
            +
                      fail_msg += ' Try `gem-install pry-doc` to get access to Ruby Core documentation.'
         
     | 
| 
       520 
497 
     | 
    
         
             
                    end
         
     | 
| 
       521 
     | 
    
         
            -
             
     | 
| 
       522 
     | 
    
         
            -
                    safe_send(next_owner, :instance_method, name) rescue nil
         
     | 
| 
      
 498 
     | 
    
         
            +
                    raise CommandError, fail_msg
         
     | 
| 
       523 
499 
     | 
    
         
             
                  end
         
     | 
| 
      
 500 
     | 
    
         
            +
                end
         
     | 
| 
       524 
501 
     | 
    
         | 
| 
       525 
     | 
    
         
            -
             
     | 
| 
       526 
     | 
    
         
            -
             
     | 
| 
       527 
     | 
    
         
            -
                   
     | 
| 
       528 
     | 
    
         
            -
                    return nil if first_ln.strip !~ /^def /
         
     | 
| 
      
 502 
     | 
    
         
            +
                # FIXME: a very similar method to this exists on WrappedModule: extract_doc_for_candidate
         
     | 
| 
      
 503 
     | 
    
         
            +
                def doc_for_pry_method
         
     | 
| 
      
 504 
     | 
    
         
            +
                  _, line_num = source_location
         
     | 
| 
       529 
505 
     | 
    
         | 
| 
       530 
     | 
    
         
            -
             
     | 
| 
       531 
     | 
    
         
            -
             
     | 
| 
       532 
     | 
    
         
            -
                     
     | 
| 
       533 
     | 
    
         
            -
             
     | 
| 
       534 
     | 
    
         
            -
             
     | 
| 
       535 
     | 
    
         
            -
                       
     | 
| 
      
 506 
     | 
    
         
            +
                  buffer = ""
         
     | 
| 
      
 507 
     | 
    
         
            +
                  Pry.line_buffer[0..(line_num - 1)].each do |line|
         
     | 
| 
      
 508 
     | 
    
         
            +
                    # Add any line that is a valid ruby comment,
         
     | 
| 
      
 509 
     | 
    
         
            +
                    # but clear as soon as we hit a non comment line.
         
     | 
| 
      
 510 
     | 
    
         
            +
                    if (line =~ /^\s*#/) || (line =~ /^\s*$/)
         
     | 
| 
      
 511 
     | 
    
         
            +
                      buffer << line.lstrip
         
     | 
| 
      
 512 
     | 
    
         
            +
                    else
         
     | 
| 
      
 513 
     | 
    
         
            +
                      buffer.replace("")
         
     | 
| 
       536 
514 
     | 
    
         
             
                    end
         
     | 
| 
       537 
     | 
    
         
            -
             
     | 
| 
       538 
     | 
    
         
            -
                    nil
         
     | 
| 
       539 
515 
     | 
    
         
             
                  end
         
     | 
| 
       540 
516 
     | 
    
         | 
| 
       541 
     | 
    
         
            -
             
     | 
| 
       542 
     | 
    
         
            -
                 
     | 
| 
       543 
     | 
    
         
            -
                # e.g.
         
     | 
| 
       544 
     | 
    
         
            -
                # class C
         
     | 
| 
       545 
     | 
    
         
            -
                #   def foo
         
     | 
| 
       546 
     | 
    
         
            -
                #     C.send(:undefine_method, :foo)
         
     | 
| 
       547 
     | 
    
         
            -
                #     Pry::Method.from_binding(binding)
         
     | 
| 
       548 
     | 
    
         
            -
                #   end
         
     | 
| 
       549 
     | 
    
         
            -
                # end
         
     | 
| 
       550 
     | 
    
         
            -
                #
         
     | 
| 
       551 
     | 
    
         
            -
                # In this case we assume that the "owner" is the singleton class of the receiver.
         
     | 
| 
       552 
     | 
    
         
            -
                #
         
     | 
| 
       553 
     | 
    
         
            -
                # This occurs mainly in Sinatra applications.
         
     | 
| 
       554 
     | 
    
         
            -
                class Disowned < Method
         
     | 
| 
       555 
     | 
    
         
            -
                  attr_reader :receiver, :name
         
     | 
| 
      
 517 
     | 
    
         
            +
                  buffer
         
     | 
| 
      
 518 
     | 
    
         
            +
                end
         
     | 
| 
       556 
519 
     | 
    
         | 
| 
       557 
     | 
    
         
            -
             
     | 
| 
       558 
     | 
    
         
            -
             
     | 
| 
       559 
     | 
    
         
            -
             
     | 
| 
       560 
     | 
    
         
            -
                   
     | 
| 
       561 
     | 
    
         
            -
                   
     | 
| 
       562 
     | 
    
         
            -
                     
     | 
| 
      
 520 
     | 
    
         
            +
                # @param [Class, Module] ancestors The ancestors to investigate
         
     | 
| 
      
 521 
     | 
    
         
            +
                # @return [Method] The unwrapped super-method
         
     | 
| 
      
 522 
     | 
    
         
            +
                def super_using_ancestors(ancestors, times=1)
         
     | 
| 
      
 523 
     | 
    
         
            +
                  next_owner = self.owner
         
     | 
| 
      
 524 
     | 
    
         
            +
                  times.times do
         
     | 
| 
      
 525 
     | 
    
         
            +
                    i = ancestors.index(next_owner) + 1
         
     | 
| 
      
 526 
     | 
    
         
            +
                    while ancestors[i] && !(ancestors[i].method_defined?(name) || ancestors[i].private_method_defined?(name))
         
     | 
| 
      
 527 
     | 
    
         
            +
                      i += 1
         
     | 
| 
      
 528 
     | 
    
         
            +
                    end
         
     | 
| 
      
 529 
     | 
    
         
            +
                    next_owner = ancestors[i] or return nil
         
     | 
| 
       563 
530 
     | 
    
         
             
                  end
         
     | 
| 
       564 
531 
     | 
    
         | 
| 
       565 
     | 
    
         
            -
                   
     | 
| 
       566 
     | 
    
         
            -
             
     | 
| 
       567 
     | 
    
         
            -
                  def undefined?
         
     | 
| 
       568 
     | 
    
         
            -
                    true
         
     | 
| 
       569 
     | 
    
         
            -
                  end
         
     | 
| 
      
 532 
     | 
    
         
            +
                  safe_send(next_owner, :instance_method, name) rescue nil
         
     | 
| 
      
 533 
     | 
    
         
            +
                end
         
     | 
| 
       570 
534 
     | 
    
         | 
| 
       571 
     | 
    
         
            -
             
     | 
| 
       572 
     | 
    
         
            -
             
     | 
| 
       573 
     | 
    
         
            -
             
     | 
| 
       574 
     | 
    
         
            -
             
     | 
| 
       575 
     | 
    
         
            -
                  end
         
     | 
| 
      
 535 
     | 
    
         
            +
                # @param [String] first_ln The first line of a method definition.
         
     | 
| 
      
 536 
     | 
    
         
            +
                # @return [String, nil]
         
     | 
| 
      
 537 
     | 
    
         
            +
                def method_name_from_first_line(first_ln)
         
     | 
| 
      
 538 
     | 
    
         
            +
                  return nil if first_ln.strip !~ /^def /
         
     | 
| 
       576 
539 
     | 
    
         | 
| 
       577 
     | 
    
         
            -
                   
     | 
| 
       578 
     | 
    
         
            -
                   
     | 
| 
       579 
     | 
    
         
            -
                   
     | 
| 
       580 
     | 
    
         
            -
             
     | 
| 
       581 
     | 
    
         
            -
             
     | 
| 
      
 540 
     | 
    
         
            +
                  tokens = CodeRay.scan(first_ln, :ruby)
         
     | 
| 
      
 541 
     | 
    
         
            +
                  tokens = tokens.tokens.each_slice(2) if tokens.respond_to?(:tokens)
         
     | 
| 
      
 542 
     | 
    
         
            +
                  tokens.each_cons(2) do |t1, t2|
         
     | 
| 
      
 543 
     | 
    
         
            +
                    if t2.last == :method || t2.last == :ident && t1 == [".", :operator]
         
     | 
| 
      
 544 
     | 
    
         
            +
                      return t2.first
         
     | 
| 
      
 545 
     | 
    
         
            +
                    end
         
     | 
| 
       582 
546 
     | 
    
         
             
                  end
         
     | 
| 
       583 
547 
     | 
    
         | 
| 
       584 
     | 
    
         
            -
                   
     | 
| 
       585 
     | 
    
         
            -
                  def method_missing(meth_name, *args, &block)
         
     | 
| 
       586 
     | 
    
         
            -
                    raise "Cannot call '#{meth_name}' on an undef'd method." if method(:name).respond_to?(meth_name)
         
     | 
| 
       587 
     | 
    
         
            -
                    Object.instance_method(:method_missing).bind(self).call(meth_name, *args, &block)
         
     | 
| 
       588 
     | 
    
         
            -
                  end
         
     | 
| 
      
 548 
     | 
    
         
            +
                  nil
         
     | 
| 
       589 
549 
     | 
    
         
             
                end
         
     | 
| 
       590 
550 
     | 
    
         
             
              end
         
     | 
| 
       591 
551 
     | 
    
         
             
            end
         
     |