diff options
Diffstat (limited to 'lib/rdoc/ri/paths.rb')
-rw-r--r-- | lib/rdoc/ri/paths.rb | 148 |
1 files changed, 94 insertions, 54 deletions
diff --git a/lib/rdoc/ri/paths.rb b/lib/rdoc/ri/paths.rb index 399fbbab00..178142d35f 100644 --- a/lib/rdoc/ri/paths.rb +++ b/lib/rdoc/ri/paths.rb @@ -1,78 +1,118 @@ require 'rdoc/ri' ## -# Encapsulate all the strangeness to do with finding out where to find RDoc -# files -# -# We basically deal with three directories: -# -# 1. The 'system' documentation directory, which holds the documentation -# distributed with Ruby, and which is managed by the Ruby install process -# 2. The 'site' directory, which contains site-wide documentation added -# locally. -# 3. The 'user' documentation directory, stored under the user's own home -# directory. -# -# There's contention about all this, but for now: -# -# system:: $datadir/ri/<ver>/system/... -# site:: $datadir/ri/<ver>/site/... -# user:: ~/.rdoc +# The directories where ri data lives. module RDoc::RI::Paths #:stopdoc: require 'rbconfig' - DOC_DIR = "doc/rdoc" + version = RbConfig::CONFIG['ruby_version'] - VERSION = RbConfig::CONFIG['ruby_version'] + base = File.join RbConfig::CONFIG['datadir'], "ri", version + SYSDIR = File.join base, "system" + SITEDIR = File.join base, "site" + homedir = File.expand_path('~') || + ENV['HOME'] || ENV['USERPROFILE'] || ENV['HOMEPATH'] - if VERSION > '1.9.1' - if m = /ruby/.match(RbConfig::CONFIG['RUBY_INSTALL_NAME']) - m = [m.pre_match, m.post_match] - else - m = [""] * 2 + HOMEDIR = if homedir then + File.join homedir, ".rdoc" + end + #: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:: ~/.ri. 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 - ri = "#{m[0]}ri#{m[1]}" - rdoc = "#{m[0]}rdoc#{m[1]}" - base = File.join(RbConfig::CONFIG['datadir'], ri, VERSION) - else - if m = /ruby/.match(RbConfig::CONFIG['RUBY_BASE_NAME']) - m = [m.pre_match, m.post_match] - else - m = [""] * 2 + + yield SYSDIR, :system if system + yield SITEDIR, :site if site + yield HOMEDIR, :home if home + + 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) and defined?(Gem::Enable) and + Gem::Enable + + # 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 - ri = "#{m[0]}ri#{m[1]}" - rdoc = "#{m[0]}rdoc#{m[1]}" - base = File.join(RbConfig::CONFIG['ridir'], VERSION) + + @gemdirs = ri_paths.map { |k,v| v.last }.sort + rescue LoadError + @gemdirs = [] end - SYSDIR = File.join(base, "system") - SITEDIR = File.join(base, "site") - HOMEDIR = (File.expand_path("~/.#{rdoc}") rescue nil) - autoload(:GEMDIRS, File.expand_path('../gemdirs.rb', __FILE__)) + ## + # Returns existing directories from the selected documentation directories + # as an Array. + # + # See also ::each - # Returns the selected documentation directories as an Array, or PATH if no - # overriding directories were given. + def self.path(system, site, home, gems, *extra_dirs) + path = raw_path system, site, home, gems, *extra_dirs - def self.path(use_system, use_site, use_home, use_gems, *extra_dirs) - path = raw_path(use_system, use_site, use_home, use_gems, *extra_dirs) - return path.select { |directory| File.directory? directory } + path.select { |directory| File.directory? directory } end - # Returns the selected documentation directories including nonexistent - # directories. Used to print out what paths were searched if no ri was - # found. + ## + # Returns selected documentation directories including nonexistent + # directories. + # + # See also ::each - def self.raw_path(use_system, use_site, use_home, use_gems, *extra_dirs) + def self.raw_path(system, site, home, gems, *extra_dirs) path = [] - path << extra_dirs unless extra_dirs.empty? - path << SYSDIR if use_system - path << SITEDIR if use_site - path << HOMEDIR if use_home - path << GEMDIRS if use_gems - return path.flatten.compact + each(system, site, home, gems, *extra_dirs) do |dir, type| + path << dir + end + + path.compact end + end + |