1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
|
require 'rdoc/ri'
##
# The directories where ri data lives. Paths can be enumerated via ::each, or
# queried individually via ::system_dir, ::site_dir, ::home_dir and ::gem_dir.
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
homedir = begin
File.expand_path('~')
rescue ArgumentError
end
homedir ||= ENV['HOME'] ||
ENV['USERPROFILE'] || ENV['HOMEPATH'] # for 1.8 compatibility
HOMEDIR = if homedir then
File.join homedir, ".rdoc"
end
#:startdoc:
##
# 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 = true, site = true, home = true, gems = :latest, *extra_dirs # :yields: directory, type
return enum_for __method__, system, site, home, gems, *extra_dirs unless
block_given?
extra_dirs.each do |dir|
yield dir, :extra
end
yield system_dir, :system if system
yield site_dir, :site if site
yield home_dir, :home if home and HOMEDIR
gemdirs(gems).each do |dir|
yield dir, :gem
end if gems
nil
end
##
# The ri directory for the gem with +gem_name+.
def self.gem_dir name, version
req = Gem::Requirement.new "= #{version}"
spec = Gem::Specification.find_by_name name, req
File.join spec.doc_dir, 'ri'
end
##
# The latest installed gems' ri directories. +filter+ can be :all or
# :latest.
#
# A +filter+ :all includes all versions of gems and includes gems without
# ri documentation.
def self.gemdirs filter = :latest
require 'rubygems' unless defined?(Gem)
ri_paths = {}
all = Gem::Specification.map do |spec|
[File.join(spec.doc_dir, 'ri'), spec.name, spec.version]
end
if filter == :all then
gemdirs = []
all.group_by do |_, name, _|
name
end.sort_by do |group, _|
group
end.map do |group, items|
items.sort_by do |_, _, version|
version
end.reverse_each do |dir,|
gemdirs << dir
end
end
return gemdirs
end
all.each do |dir, name, ver|
next unless File.exist? dir
if ri_paths[name].nil? or ver > ri_paths[name].first then
ri_paths[name] = [ver, name, dir]
end
end
ri_paths.sort_by { |_, (_, name, _)| name }.map { |k, v| v.last }
rescue LoadError
[]
end
##
# The location of the rdoc data in the user's home directory.
#
# Like ::system, ri data in the user's home directory is rare and predates
# libraries distributed via RubyGems. ri data is rarely generated into this
# directory.
def self.home_dir
HOMEDIR
end
##
# Returns existing directories from the selected documentation directories
# as an Array.
#
# See also ::each
def self.path(system = true, site = true, home = true, gems = :latest, *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
##
# The location of ri data installed into the site dir.
#
# Historically this was available for documentation installed by Ruby
# libraries predating RubyGems. It is unlikely to contain any content for
# modern Ruby installations.
def self.site_dir
File.join BASE, 'site'
end
##
# The location of the built-in ri data.
#
# This data is built automatically when `make` is run when Ruby is
# installed. If you did not install Ruby by hand you may need to install
# the documentation yourself. Please consult the documentation for your
# package manager or Ruby installer for details. You can also use the
# rdoc-data gem to install system ri data for common versions of Ruby.
def self.system_dir
File.join BASE, 'system'
end
end
|