summaryrefslogtreecommitdiff
path: root/lib/rdoc/ri/paths.rb
diff options
context:
space:
mode:
authordrbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-04-01 07:45:16 +0000
committerdrbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-04-01 07:45:16 +0000
commit46580b51477355fece514573c88cb67030f4a502 (patch)
tree779c1a64466643461b3daa4cd9a3548b84f0fd55 /lib/rdoc/ri/paths.rb
parent9b40cdfe8c973a061c5683ad78c283b9ddb8b2e9 (diff)
Import RDoc 2.5
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27147 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/rdoc/ri/paths.rb')
-rw-r--r--lib/rdoc/ri/paths.rb148
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
+