class Pry::Command::Ri

Public Class Methods

new(pager, opts) click to toggle source
Calls superclass method
# File lib/pry/commands/ri.rb, line 37
def initialize(pager, opts)
  @pager = pager
  super opts
end

Public Instance Methods

formatter(_io) click to toggle source
# File lib/pry/commands/ri.rb, line 48
def formatter(_io)
  if @formatter_klass
    @formatter_klass.new
  else
    RDoc::Markup::ToAnsi.new
  end
end
page() { |paging_text| ... } click to toggle source
# File lib/pry/commands/ri.rb, line 42
def page
  paging_text = StringIO.new
  yield paging_text
  @pager.page(paging_text.string)
end
process(spec) click to toggle source
# File lib/pry/commands/ri.rb, line 21
def process(spec)
  unless spec
    return output.puts(
      "Please provide a class, module, or method name (e.g: ri Array#push)"
    )
  end

  # Lazily load RI
  require 'rdoc/ri/driver'

  unless defined? RDoc::RI::PryDriver

    # Subclass RI so that it formats its output nicely, and uses `lesspipe`.
    subclass = Class.new(RDoc::RI::Driver) # the hard way.

    subclass.class_eval do
      def initialize(pager, opts)
        @pager = pager
        super opts
      end

      def page
        paging_text = StringIO.new
        yield paging_text
        @pager.page(paging_text.string)
      end

      def formatter(_io)
        if @formatter_klass
          @formatter_klass.new
        else
          RDoc::Markup::ToAnsi.new
        end
      end
    end

    RDoc::RI.const_set :PryDriver, subclass # hook it up!
  end

  # Spin-up an RI insance.
  ri = RDoc::RI::PryDriver.new(
    pry_instance.pager, use_stdout: true, interactive: false
  )

  begin
    ri.display_names [spec] # Get the documentation (finally!)
  rescue RDoc::RI::Driver::NotFoundError => e
    output.puts "error: '#{e.name}' not found"
  end
end