pry 0.9.11.4-java → 0.9.12-java
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
         |