1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/lib/rdoc/ri/paths.rb

119 lines
2.7 KiB
Ruby
Raw Normal View History

require 'rdoc/ri'
##
# The directories where ri data lives.
module RDoc::RI::Paths
#:stopdoc:
require 'rbconfig'
version = RbConfig::CONFIG['ruby_version']
base = if RbConfig::CONFIG.key? 'ridir' then
File.join RbConfig::CONFIG['ridir'], version
else
File.join RbConfig::CONFIG['datadir'], 'ri', version
end
SYSDIR = File.join base, "system"
SITEDIR = File.join base, "site"
HOMEDIR = File.expand_path('~/.rdoc') rescue nil
#:startdoc:
@gemdirs = nil
##
# Iterates over each selected path yielding the directory and type.
#
# Yielded types:
# :system:: Where Ruby's ri data is stored. Yielded when +system+ is
# true
# :site:: Where ri for installed libraries are stored. Yielded when
# +site+ is true. Normally no ri data is stored here.
# :home:: ~/.rdoc. Yielded when +home+ is true.
# :gem:: ri data for an installed gem. Yielded when +gems+ is true.
# :extra:: ri data directory from the command line. Yielded for each
# entry in +extra_dirs+
def self.each system, site, home, gems, *extra_dirs # :yields: directory, type
extra_dirs.each do |dir|
yield dir, :extra
end
yield SYSDIR, :system if system
yield SITEDIR, :site if site
yield HOMEDIR, :home if home and HOMEDIR
gemdirs.each do |dir|
yield dir, :gem
end if gems
nil
end
##
# The latest installed gems' ri directories
def self.gemdirs
return @gemdirs if @gemdirs
require 'rubygems' unless defined?(Gem)
# HACK dup'd from Gem.latest_partials and friends
all_paths = []
all_paths = Gem.path.map do |dir|
Dir[File.join(dir, 'doc', '*', 'ri')]
end.flatten
ri_paths = {}
all_paths.each do |dir|
base = File.basename File.dirname(dir)
if base =~ /(.*)-((\d+\.)*\d+)/ then
name, version = $1, $2
ver = Gem::Version.new version
if ri_paths[name].nil? or ver > ri_paths[name][0] then
ri_paths[name] = [ver, dir]
end
end
end
@gemdirs = ri_paths.map { |k,v| v.last }.sort
rescue LoadError
@gemdirs = []
end
##
# Returns existing directories from the selected documentation directories
# as an Array.
#
# See also ::each
def self.path(system, site, home, gems, *extra_dirs)
path = raw_path system, site, home, gems, *extra_dirs
path.select { |directory| File.directory? directory }
end
##
# Returns selected documentation directories including nonexistent
# directories.
#
# See also ::each
def self.raw_path(system, site, home, gems, *extra_dirs)
path = []
each(system, site, home, gems, *extra_dirs) do |dir, type|
path << dir
end
path.compact
end
end