lib/pry/default_commands/documentation.rb



class Pry
  module DefaultCommands

    Documentation = Pry::CommandSet.new do

      command "ri", "View ri documentation. e.g `ri Array#each`" do |*args|
        run ".ri", *args
      end

      command "show-doc", "Show the comments above METH. Type `show-doc --help` for more info. Aliases: \?", :shellwords => false do |*args|
        opts, meth = parse_options!(args, :method_object) do |opt|
          opt.banner unindent <<-USAGE
            Usage: show-doc [OPTIONS] [METH]
            Show the comments above method METH. Tries instance methods first and then methods by default.
            e.g show-doc hello_method
          USAGE

          opt.on :f, :flood, "Do not use a pager to view text longer than one screen."
        end

        raise Pry::CommandError, "No documentation found." if meth.doc.nil? || meth.doc.empty?

        doc = process_comment_markup(meth.doc, meth.source_type)
        output.puts make_header(meth, doc)
        output.puts "#{text.bold("Owner:")} #{meth.owner || "N/A"}"
        output.puts "#{text.bold("Visibility:")} #{meth.visibility}"
        output.puts "#{text.bold("Signature:")} #{meth.signature}"
        output.puts
        render_output(opts.flood?, false, doc)
      end

      alias_command "?", "show-doc"

      command "stat", "View method information and set _file_ and _dir_ locals. Type `stat --help` for more info.", :shellwords => false do |*args|
        target = target()

        opts, meth = parse_options!(args, :method_object) do |opt|
          opt.banner unindent <<-USAGE
            Usage: stat [OPTIONS] [METH]
            Show method information for method METH and set _file_ and _dir_ locals.
            e.g: stat hello_method
          USAGE
        end

        output.puts unindent <<-EOS
          Method Information:
          --
          Name: #{meth.name}
          Owner: #{meth.owner ? meth.owner : "Unknown"}
          Visibility: #{meth.visibility}
          Type: #{meth.is_a?(::Method) ? "Bound" : "Unbound"}
          Arity: #{meth.arity}
          Method Signature: #{meth.signature}
          Source Location: #{meth.source_location ? meth.source_location.join(":") : "Not found."}
        EOS
      end

      command "gist-method", "Gist a method to github. Type `gist-method --help` for more info.", :requires_gem => "gist", :shellwords => false do |*args|
        require 'gist'

        target = target()

        opts, meth = parse_options!(args, :method_object) do |opt|
          opt.banner unindent <<-USAGE
            Usage: gist-method [OPTIONS] [METH]
            Gist the method (doc or source) to github.
            Ensure the `gist` gem is properly working before use. http://github.com/defunkt/gist for instructions.
            e.g: gist -m my_method
            e.g: gist -d my_method
          USAGE

          opt.on :d, :doc, "Gist a method's documentation."
          opt.on :p, :private, "Create a private gist (default: true)", :default => true
        end

        type_map = { :ruby => "rb", :c => "c", :plain => "plain" }
        if !opts.doc?
          content = meth.source
          code_type = meth.source_type
        else
          content = meth.doc
          code_type = meth.source_type

          text.no_color do
            content = process_comment_markup(content, code_type)
          end
          code_type = :plain
        end

        link = Gist.write([:extension => ".#{type_map[code_type]}",
                           :input => content],
                          opts.p?)

        output.puts "Gist created at #{link}"
      end
    end
  end
end