# class RDoc

We define the following two similar name classes in this file:

- `RDoc::RubyGemsHook`

- `RDoc::RubygemsHook`

`RDoc::RubyGemsHook` is the main class that has real logic.

`RDoc::RubygemsHook` is a class that is only for compatibility. `RDoc::RubygemsHook` is used by RubyGems directly. We can remove this when all maintained RubyGems remove ‘rubygems/rdoc.rb`.

### Attributes

rdoc_version [R]

Loaded version of RDoc. Set by `::load_rdoc`

force [RW]

Force installation of documentation?

generate_rdoc [RW]

Generate rdoc?

generate_ri [RW]

Generate ri data?

### Public Class Methods

generate (installer, specs)
Source

    # File lib/rdoc/rubygems_hook.rb, line 54
    def self.generate(installer, specs)
      start = Time.now
      types = installer.document

      generate_rdoc = types.include? 'rdoc'
      generate_ri   = types.include? 'ri'

      specs.each do |spec|
        new(spec, generate_rdoc, generate_ri).generate
      end

      return unless generate_rdoc or generate_ri

      duration = (Time.now - start).to_i
      names    = specs.map(&:name).join ', '

      say "Done installing documentation for #{names} after #{duration} seconds"
    end

Post installs hook that generates documentation for each specification in `specs`

load_rdoc ()
Source

    # File lib/rdoc/rubygems_hook.rb, line 80
    def self.load_rdoc
      return if @rdoc_version

      require_relative 'rdoc'

      @rdoc_version = Gem::Version.new ::RDoc::VERSION
    end

Loads the RDoc generator

new (spec, generate_rdoc = false, generate_ri = true)
Source

    # File lib/rdoc/rubygems_hook.rb, line 95
    def initialize(spec, generate_rdoc = false, generate_ri = true)
      @doc_dir   = spec.doc_dir
      @force     = false
      @rdoc      = nil
      @spec      = spec

      @generate_rdoc = generate_rdoc
      @generate_ri   = generate_ri

      @rdoc_dir = spec.doc_dir 'rdoc'
      @ri_dir   = spec.doc_dir 'ri'
    end

Creates a new documentation generator for `spec`. RDoc and ri data generation can be enabled or disabled through `generate_rdoc` and `generate_ri` respectively.

Only `generate_ri` is enabled by default.

remove (uninstaller)
Source

    # File lib/rdoc/rubygems_hook.rb, line 73
    def self.remove(uninstaller)
      new(uninstaller.spec).remove
    end

### Public Instance Methods

delete_legacy_args (args)
Source

    # File lib/rdoc/rubygems_hook.rb, line 113
    def delete_legacy_args(args)
      args.delete '--inline-source'
      args.delete '--promiscuous'
      args.delete '-p'
      args.delete '--one-file'
    end

Removes legacy rdoc arguments from `args`

document (generator, options, destination)
Source

    # File lib/rdoc/rubygems_hook.rb, line 126
    def document(generator, options, destination)
      generator_name = generator

      options = options.dup
      options.exclude ||= [] # TODO maybe move to RDoc::Options#finish
      options.setup_generator generator
      options.op_dir = destination
      Dir.chdir @spec.full_gem_path do
        options.finish
      end

      generator = options.generator.new @rdoc.store, options

      @rdoc.options = options
      @rdoc.generator = generator

      say "Installing #{generator_name} documentation for #{@spec.full_name}"

      FileUtils.mkdir_p options.op_dir

      Dir.chdir options.op_dir do
        begin
          @rdoc.class.current = @rdoc
          @rdoc.generator.generate
        ensure
          @rdoc.class.current = nil
        end
      end
    end

Generates documentation using the named `generator` (“darkfish” or “ri”) and following the given `options`.

Documentation will be generated into `destination`

generate ()
Source

    # File lib/rdoc/rubygems_hook.rb, line 159
    def generate
      return if @spec.default_gem?
      return unless @generate_ri or @generate_rdoc

      setup

      options = nil

      args = @spec.rdoc_options
      args.concat @spec.source_paths
      args.concat @spec.extra_rdoc_files

      case config_args = Gem.configuration[:rdoc]
      when String then
        args = args.concat config_args.split(' ')
      when Array then
        args = args.concat config_args
      end

      delete_legacy_args args

      Dir.chdir @spec.full_gem_path do
        options = ::RDoc::Options.new
        options.default_title = "#{@spec.full_name} Documentation"
        options.parse args
        options.quiet = !Gem.configuration.really_verbose
      end

      @rdoc = new_rdoc

      say "Parsing documentation for #{@spec.full_name}"

      Dir.chdir @spec.full_gem_path do
        # RDoc::Options#finish must be called before parse_files.
        # RDoc::Options#finish is also called after ri/darkfish generator setup.
        # We need to dup the options to avoid modifying it after finish is called.
        parse_options = options.dup
        parse_options.finish
        @rdoc.options = parse_options
        @rdoc.store = RDoc::Store.new(parse_options)
        @rdoc.parse_files parse_options.files
      end

      document 'ri',       options, @ri_dir if
        @generate_ri   and (@force or not File.exist? @ri_dir)

      document 'darkfish', options, @rdoc_dir if
        @generate_rdoc and (@force or not File.exist? @rdoc_dir)
    end

Generates RDoc and ri data

rdoc_installed? ()
Source

    # File lib/rdoc/rubygems_hook.rb, line 220
    def rdoc_installed?
      File.exist? @rdoc_dir
    end

Is rdoc documentation installed?

remove ()
Source

    # File lib/rdoc/rubygems_hook.rb, line 227
    def remove
      base_dir = @spec.base_dir

      raise Gem::FilePermissionError, base_dir unless File.writable? base_dir

      FileUtils.rm_rf @rdoc_dir
      FileUtils.rm_rf @ri_dir
    end

Removes generated RDoc and ri data

ri_installed? ()
Source

    # File lib/rdoc/rubygems_hook.rb, line 239
    def ri_installed?
      File.exist? @ri_dir
    end

Is ri data installed?

setup ()
Source

    # File lib/rdoc/rubygems_hook.rb, line 246
    def setup
      self.class.load_rdoc

      raise Gem::FilePermissionError, @doc_dir if
        File.exist?(@doc_dir) and not File.writable?(@doc_dir)

      FileUtils.mkdir_p @doc_dir unless File.exist? @doc_dir
    end

Prepares the spec for documentation generation