#!/usr/bin/env ruby
require 'rake'
require 'rake/tasklib'
module Rake
# Create a documentation task that will generate the RDoc files for
# a project.
#
# The RDocTask will create the following targets:
#
# [rdoc]
# Main task for this RDOC task.
#
# [:clobber_rdoc]
# Delete all the rdoc files. This target is automatically
# added to the main clobber target.
#
# [:rerdoc]
# Rebuild the rdoc files from scratch, even if they are not out
# of date.
#
# Simple Example:
#
# Rake::RDocTask.new do |rd|
# rd.main = "README.rdoc"
# rd.rdoc_files.include("README.rdoc", "lib/**/*.rb")
# end
#
# You may wish to give the task a different name, such as if you are
# generating two sets of documentation. For instance, if you want to have a
# development set of documentation including private methods:
#
# Rake::RDocTask.new(:rdoc_dev) do |rd|
# rd.main = "README.doc"
# rd.rdoc_files.include("README.rdoc", "lib/**/*.rb")
# rd.options << "--all"
# end
#
# The tasks would then be named :rdoc_dev, :clobber_rdoc_dev, and
# :rerdoc_dev.
#
class RDocTask < TaskLib
# Name of the main, top level task. (default is :rdoc)
attr_accessor :name
# Name of directory to receive the html output files. (default is "html")
attr_accessor :rdoc_dir
# Title of RDoc documentation. (default is none)
attr_accessor :title
# Name of file to be used as the main, top level file of the
# RDoc. (default is none)
attr_accessor :main
# Name of template to be used by rdoc. (defaults to rdoc's default)
attr_accessor :template
# List of files to be included in the rdoc generation. (default is [])
attr_accessor :rdoc_files
# List of options to be passed rdoc. (default is [])
attr_accessor :options
# Run the rdoc process as an external shell (default is false)
attr_accessor :external
# Create an RDoc task named rdoc. Default task name is +rdoc+.
def initialize(name=:rdoc) # :yield: self
@name = name
@rdoc_files = Rake::FileList.new
@rdoc_dir = 'html'
@main = nil
@title = nil
@template = nil
@external = false
@options = []
yield self if block_given?
define
end
# Create the tasks defined by this task lib.
def define
if name.to_s != "rdoc"
desc "Build the RDOC HTML Files"
end
desc "Build the #{name} HTML Files"
task name
desc "Force a rebuild of the RDOC files"
task "re#{name}" => ["clobber_#{name}", name]
desc "Remove rdoc products"
task "clobber_#{name}" do
rm_r rdoc_dir rescue nil
end
task :clobber => ["clobber_#{name}"]
directory @rdoc_dir
task name => [rdoc_target]
file rdoc_target => @rdoc_files + [Rake.application.rakefile] do
rm_r @rdoc_dir rescue nil
args = option_list + @rdoc_files
if @external
argstring = args.join(' ')
sh %{ruby -Ivendor vender/rd #{argstring}}
else
require 'rdoc/rdoc'
RDoc::RDoc.new.document(args)
end
end
self
end
def option_list
result = @options.dup
result << "-o" << @rdoc_dir
result << "--main" << quote(main) if main
result << "--title" << quote(title) if title
result << "-T" << quote(template) if template
result
end
def quote(str)
if @external
"'#{str}'"
else
str
end
end
def option_string
option_list.join(' ')
end
private
def rdoc_target
"#{rdoc_dir}/index.html"
end
end
end