123456789_123456789_123456789_123456789_123456789_

Class: Gem::RDoc

Do not use. This class is for internal use only.
Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Instance Chain:
Inherits: Object
Defined in: lib/rubygems/rdoc.rb

Overview

RDoc provides methods to generate RDoc and ri data for installed gems. It works for RDoc 1.0.1 (in Ruby 1.8) up to RDoc 3.6.

This implementation is considered obsolete. The RDoc project is the appropriate location to find this functionality. This file provides the hooks to load RDoc generation code from the “rdoc” gem and a fallback in case the installed version of RDoc does not have them.

Class Attribute Summary

Class Method Summary

UserInteraction - Extended

alert

Displays an alert statement.

alert_error

Displays an error statement to the error output location.

alert_warning

Displays a warning statement to the warning output location.

ask

Asks a question and returns the answer.

ask_for_password

Asks for a password with a prompt

ask_yes_no

Asks a yes or no question.

choose_from_list

Asks the user to answer question with an answer from the given list.

say

Displays the given statement on the standard output (or equivalent).

terminate_interaction

Terminates the RubyGems process with the given exit_code

verbose

Calls say with msg or the results of the block if really_verbose is true.

DefaultUserInteraction - Included

Text - Included

clean_text

Remove any non-printable characters and make the text suitable for printing.

format_text

Wraps text to wrap characters and optionally indents by indent characters.

levenshtein_distance

This code is based directly on the Text gem implementation Returns a value representing the “cost” of transforming str1 into str2.

truncate_text, min3

Instance Attribute Summary

DefaultUserInteraction - Included

Instance Method Summary

UserInteraction - Included

#alert

Displays an alert statement.

#alert_error

Displays an error statement to the error output location.

#alert_warning

Displays a warning statement to the warning output location.

#ask

Asks a question and returns the answer.

#ask_for_password

Asks for a password with a prompt

#ask_yes_no

Asks a yes or no question.

#choose_from_list

Asks the user to answer question with an answer from the given list.

#say

Displays the given statement on the standard output (or equivalent).

#terminate_interaction

Terminates the RubyGems process with the given exit_code

#verbose

Calls say with msg or the results of the block if really_verbose is true.

DefaultUserInteraction - Included

Text - Included

#clean_text

Remove any non-printable characters and make the text suitable for printing.

#format_text

Wraps text to wrap characters and optionally indents by indent characters.

#levenshtein_distance

This code is based directly on the Text gem implementation Returns a value representing the “cost” of transforming str1 into str2.

#truncate_text, #min3

Constructor Details

.new(spec, generate_rdoc = true, generate_ri = true) ⇒ RDoc

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.

[ GitHub ]

  
# File 'lib/rubygems/rdoc.rb', line 118

def initialize spec, generate_rdoc = true, generate_ri = true
  @doc_dir   = spec.doc_dir
  @file_info = nil
  @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

#initialize(spec, generate_rdoc = true, generate_ri = true) ⇒ RDoc

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.

[ GitHub ]

  
# File 'lib/rubygems/rdoc.rb', line 118

def initialize spec, generate_rdoc = true, generate_ri = true
  @doc_dir   = spec.doc_dir
  @file_info = nil
  @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

Class Attribute Details

.rdoc_version (readonly)

Loaded version of RDoc. Set by .load_rdoc

[ GitHub ]

  
# File 'lib/rubygems/rdoc.rb', line 66

attr_reader :rdoc_version

Class Method Details

.generation_hook(installer, specs)

Post installs hook that generates documentation for each specification in specs

[ GitHub ]

  
# File 'lib/rubygems/rdoc.rb', line 74

def self.generation_hook 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

.load_rdoc

Loads the RDoc generator

[ GitHub ]

  
# File 'lib/rubygems/rdoc.rb', line 96

def self.load_rdoc
  return if @rdoc_version

  require 'rdoc/rdoc'

  @rdoc_version = if ::RDoc.const_defined? :VERSION then
                    Gem::Version.new ::RDoc::VERSION
                  else
                    Gem::Version.new '1.0.1'
                  end

rescue LoadError => e
  raise Gem::DocumentError, "RDoc is not installed: #{e}"
end

Instance Attribute Details

#force (rw)

Force installation of documentation?

[ GitHub ]

  
# File 'lib/rubygems/rdoc.rb', line 49

attr_accessor :force

#generate_rdoc (rw)

Generate rdoc?

[ GitHub ]

  
# File 'lib/rubygems/rdoc.rb', line 54

attr_accessor :generate_rdoc

#generate_ri (rw)

Generate ri data?

[ GitHub ]

  
# File 'lib/rubygems/rdoc.rb', line 59

attr_accessor :generate_ri

#rdoc_installed?Boolean (readonly)

Is rdoc documentation installed?

[ GitHub ]

  
# File 'lib/rubygems/rdoc.rb', line 298

def rdoc_installed?
  File.exist? @rdoc_dir
end

#ri_installed?Boolean (readonly)

Is ri data installed?

[ GitHub ]

  
# File 'lib/rubygems/rdoc.rb', line 317

def ri_installed?
  File.exist? @ri_dir
end

Instance Method Details

#delete_legacy_args(args)

Removes legacy rdoc arguments from args

[ GitHub ]

  
# File 'lib/rubygems/rdoc.rb', line 137

def delete_legacy_args args
  args.delete '--inline-source'
  args.delete '--promiscuous'
  args.delete '-p'
  args.delete '--one-file'
end

#document(generator, options, destination)

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

Documentation will be generated into destination

[ GitHub ]

  
# File 'lib/rubygems/rdoc.rb', line 150

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
  options.finish

  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 @file_info
    ensure
      @rdoc.class.current = nil
    end
  end
end

#generate

Generates RDoc and ri data

[ GitHub ]

  
# File 'lib/rubygems/rdoc.rb', line 181

def generate
  return unless @generate_ri or @generate_rdoc

  setup

  options = nil

  if Gem::Requirement.new('< 3').satisfied_by? self.class.rdoc_version then
    generate_legacy
    return
  end

  ::RDoc::TopLevel.reset # TODO ::RDoc::RDoc.reset
  ::RDoc::Parser::C.reset

  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
  end

  options.quiet = !Gem.configuration.really_verbose

  @rdoc = new_rdoc
  @rdoc.options = options

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

  Dir.chdir @spec.full_gem_path do
    @file_info = @rdoc.parse_files 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

#generate_legacy

Generates RDoc and ri data for legacy RDoc versions. This method will not exist in future versions.

[ GitHub ]

  
# File 'lib/rubygems/rdoc.rb', line 237

def generate_legacy
  if @generate_rdoc then
    FileUtils.rm_rf @rdoc_dir
    say "Installing RDoc documentation for #{@spec.full_name}"
    legacy_rdoc '--op', @rdoc_dir
  end

  if @generate_ri then
    FileUtils.rm_rf @ri_dir
    say "Installing ri documentation for #{@spec.full_name}"
    legacy_rdoc '--ri', '--op', @ri_dir
  end
end

#legacy_rdoc(*args)

Generates RDoc using a legacy version of RDoc from the ARGV-like args. This method will not exist in future versions.

[ GitHub ]

  
# File 'lib/rubygems/rdoc.rb', line 255

def legacy_rdoc *args
  args << @spec.rdoc_options
  args << '--quiet'
  args << @spec.require_paths.clone
  args << @spec.extra_rdoc_files
  args << '--title' << "#{@spec.full_name} Documentation"
  args = args.flatten.map do |arg| arg.to_s end

  delete_legacy_args args if
    Gem::Requirement.new('>= 2.4.0') =~ self.class.rdoc_version

  r = new_rdoc
  verbose { "rdoc #{args.join ' '}" }

  Dir.chdir @spec.full_gem_path do
    begin
      r.document args
    rescue Errno::EACCES => e
      dirname = File.dirname e.message.split("-")[1].strip
      raise Gem::FilePermissionError, dirname
    rescue Interrupt => e
      raise e
    rescue Exception => ex
      alert_error "While generating documentation for #{@spec.full_name}"
      ui.errs.puts "... MESSAGE:   #{ex}"
      ui.errs.puts "... RDOC args: #{args.join(' ')}"
      ui.backtrace ex
      ui.errs.puts "(continuing with the rest of the installation)"
    end
  end
end

#new_rdoc

#new_rdoc creates a new RDoc instance. This method is provided only to make testing easier.

[ GitHub ]

  
# File 'lib/rubygems/rdoc.rb', line 291

def new_rdoc # :nodoc:
  ::RDoc::RDoc.new
end

#remove

Removes generated RDoc and ri data

[ GitHub ]

  
# File 'lib/rubygems/rdoc.rb', line 305

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

#setup

Prepares the spec for documentation generation

[ GitHub ]

  
# File 'lib/rubygems/rdoc.rb', line 324

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