rdoc 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rdoc might be problematic. Click here for more details.
- data/History.txt +82 -1
- data/Manifest.txt +8 -0
- data/README.txt +33 -9
- data/RI.txt +58 -0
- data/Rakefile +2 -0
- data/bin/ri +1 -2
- data/lib/rdoc.rb +154 -36
- data/lib/rdoc/code_objects.rb +38 -2
- data/lib/rdoc/diagram.rb +17 -15
- data/lib/rdoc/generator.rb +21 -15
- data/lib/rdoc/generator/chm/chm.rb +2 -0
- data/lib/rdoc/generator/html.rb +137 -89
- data/lib/rdoc/generator/html/common.rb +24 -0
- data/lib/rdoc/generator/html/frameless.rb +28 -731
- data/lib/rdoc/generator/html/hefss.rb +47 -311
- data/lib/rdoc/generator/html/html.rb +226 -156
- data/lib/rdoc/generator/html/kilmer.rb +31 -298
- data/lib/rdoc/generator/html/kilmerfactory.rb +427 -0
- data/lib/rdoc/generator/html/one_page_html.rb +6 -5
- data/lib/rdoc/generator/texinfo.rb +3 -6
- data/lib/rdoc/generator/xml.rb +4 -7
- data/lib/rdoc/generator/xml/xml.rb +21 -9
- data/lib/rdoc/markup.rb +0 -95
- data/lib/rdoc/markup/inline.rb +1 -1
- data/lib/rdoc/markup/to_html.rb +9 -6
- data/lib/rdoc/markup/to_html_crossref.rb +67 -21
- data/lib/rdoc/markup/to_texinfo.rb +1 -1
- data/lib/rdoc/parser.rb +22 -1
- data/lib/rdoc/parser/c.rb +14 -16
- data/lib/rdoc/parser/ruby.rb +3 -3
- data/lib/rdoc/parser/simple.rb +1 -1
- data/lib/rdoc/rdoc.rb +0 -1
- data/lib/rdoc/ri/cache.rb +5 -6
- data/lib/rdoc/ri/descriptions.rb +3 -0
- data/lib/rdoc/ri/display.rb +157 -37
- data/lib/rdoc/ri/driver.rb +314 -198
- data/lib/rdoc/ri/formatter.rb +1 -1
- data/lib/rdoc/ri/paths.rb +2 -11
- data/lib/rdoc/ri/reader.rb +3 -3
- data/lib/rdoc/ri/util.rb +0 -2
- data/test/binary.dat +0 -0
- data/test/rdoc_markup_to_html_crossref_reference.rb +31 -0
- data/test/test_attribute_manager.rb +73 -0
- data/test/test_rdoc_info_formatting.rb +6 -6
- data/test/test_rdoc_info_sections.rb +2 -2
- data/test/test_rdoc_markup_attribute_manager.rb +14 -14
- data/test/test_rdoc_markup_to_html.rb +15 -3
- data/test/test_rdoc_markup_to_html_crossref.rb +276 -7
- data/test/test_rdoc_parser.rb +13 -0
- data/test/test_rdoc_parser_c.rb +1 -1
- data/test/test_rdoc_parser_ruby.rb +72 -1
- data/test/test_rdoc_ri_default_display.rb +23 -22
- data/test/test_rdoc_ri_driver.rb +1 -1
- data/test/test_rdoc_ri_formatter.rb +1 -1
- metadata +27 -35
- data.tar.gz.sig +0 -1
- metadata.gz.sig +0 -0
    
        data/lib/rdoc/ri/driver.rb
    CHANGED
    
    | @@ -11,29 +11,33 @@ require 'rdoc/markup/to_flow' | |
| 11 11 |  | 
| 12 12 | 
             
            class RDoc::RI::Driver
         | 
| 13 13 |  | 
| 14 | 
            -
               | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
                  hash
         | 
| 33 | 
            -
                end
         | 
| 14 | 
            +
              #
         | 
| 15 | 
            +
              # This class offers both Hash and OpenStruct functionality.
         | 
| 16 | 
            +
              # We convert from the Core Hash to this before calling any of
         | 
| 17 | 
            +
              # the display methods, in order to give the display methods
         | 
| 18 | 
            +
              # a cleaner API for accessing the data.
         | 
| 19 | 
            +
              #
         | 
| 20 | 
            +
              class OpenStructHash < Hash
         | 
| 21 | 
            +
                #
         | 
| 22 | 
            +
                # This method converts from a Hash to an OpenStructHash.
         | 
| 23 | 
            +
                #
         | 
| 24 | 
            +
                def self.convert(object)
         | 
| 25 | 
            +
                  case object
         | 
| 26 | 
            +
                  when Hash then
         | 
| 27 | 
            +
                    new_hash = new # Convert Hash -> OpenStructHash
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                    object.each do |key, value|
         | 
| 30 | 
            +
                      new_hash[key] = convert(value)
         | 
| 31 | 
            +
                    end
         | 
| 34 32 |  | 
| 35 | 
            -
             | 
| 36 | 
            -
                   | 
| 33 | 
            +
                    new_hash
         | 
| 34 | 
            +
                  when Array then
         | 
| 35 | 
            +
                    object.map do |element|
         | 
| 36 | 
            +
                      convert(element)
         | 
| 37 | 
            +
                    end
         | 
| 38 | 
            +
                  else
         | 
| 39 | 
            +
                    object
         | 
| 40 | 
            +
                  end
         | 
| 37 41 | 
             
                end
         | 
| 38 42 |  | 
| 39 43 | 
             
                def merge_enums(other)
         | 
| @@ -57,6 +61,10 @@ class RDoc::RI::Driver | |
| 57 61 | 
             
                    end
         | 
| 58 62 | 
             
                  end
         | 
| 59 63 | 
             
                end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                def method_missing method, *args
         | 
| 66 | 
            +
                  self[method.to_s]
         | 
| 67 | 
            +
                end
         | 
| 60 68 | 
             
              end
         | 
| 61 69 |  | 
| 62 70 | 
             
              class Error < RDoc::RI::Error; end
         | 
| @@ -74,16 +82,17 @@ class RDoc::RI::Driver | |
| 74 82 | 
             
                options[:use_stdout] = !$stdout.tty?
         | 
| 75 83 | 
             
                options[:width] = 72
         | 
| 76 84 | 
             
                options[:formatter] = RDoc::RI::Formatter.for 'plain'
         | 
| 85 | 
            +
                options[:interactive] = false
         | 
| 77 86 | 
             
                options[:list_classes] = false
         | 
| 78 87 | 
             
                options[:list_names] = false
         | 
| 88 | 
            +
                options[:use_cache] = true
         | 
| 79 89 |  | 
| 80 | 
            -
                # By default all paths are used. | 
| 81 | 
            -
                 | 
| 82 | 
            -
                 | 
| 83 | 
            -
                 | 
| 84 | 
            -
                 | 
| 85 | 
            -
                 | 
| 86 | 
            -
                doc_dirs = []
         | 
| 90 | 
            +
                # By default all standard paths are used.
         | 
| 91 | 
            +
                options[:use_system] = true
         | 
| 92 | 
            +
                options[:use_site] = true
         | 
| 93 | 
            +
                options[:use_home] = true
         | 
| 94 | 
            +
                options[:use_gems] = true
         | 
| 95 | 
            +
                options[:extra_doc_dirs] = []
         | 
| 87 96 |  | 
| 88 97 | 
             
                opts = OptionParser.new do |opt|
         | 
| 89 98 | 
             
                  opt.program_name = File.basename $0
         | 
| @@ -150,22 +159,6 @@ Options may also be set in the 'RI' environment variable. | |
| 150 159 |  | 
| 151 160 | 
             
                  opt.separator nil
         | 
| 152 161 |  | 
| 153 | 
            -
                  opt.on("--doc-dir=DIRNAME", "-d", Array,
         | 
| 154 | 
            -
                         "List of directories to search for",
         | 
| 155 | 
            -
                         "documentation. If not specified, we search",
         | 
| 156 | 
            -
                         "the standard rdoc/ri directories. May be",
         | 
| 157 | 
            -
                         "repeated.") do |value|
         | 
| 158 | 
            -
                    value.each do |dir|
         | 
| 159 | 
            -
                      unless File.directory? dir then
         | 
| 160 | 
            -
                        raise OptionParser::InvalidArgument, "#{dir} is not a directory"
         | 
| 161 | 
            -
                      end
         | 
| 162 | 
            -
                    end
         | 
| 163 | 
            -
             | 
| 164 | 
            -
                    doc_dirs.concat value
         | 
| 165 | 
            -
                  end
         | 
| 166 | 
            -
             | 
| 167 | 
            -
                  opt.separator nil
         | 
| 168 | 
            -
             | 
| 169 162 | 
             
                  opt.on("--fmt=FORMAT", "--format=FORMAT", "-f",
         | 
| 170 163 | 
             
                         RDoc::RI::Formatter::FORMATTERS.keys,
         | 
| 171 164 | 
             
                         "Format to use when displaying output:",
         | 
| @@ -179,49 +172,109 @@ Options may also be set in the 'RI' environment variable. | |
| 179 172 |  | 
| 180 173 | 
             
                  opt.separator nil
         | 
| 181 174 |  | 
| 182 | 
            -
                   | 
| 183 | 
            -
             | 
| 184 | 
            -
             | 
| 185 | 
            -
             | 
| 175 | 
            +
                  opt.on("--doc-dir=DIRNAME", "-d", Array,
         | 
| 176 | 
            +
                         "List of directories from which to source",
         | 
| 177 | 
            +
                         "documentation in addition to the standard",
         | 
| 178 | 
            +
                         "directories.  May be repeated.") do |value|
         | 
| 179 | 
            +
                    value.each do |dir|
         | 
| 180 | 
            +
                      unless File.directory? dir then
         | 
| 181 | 
            +
                        raise OptionParser::InvalidArgument, "#{dir} is not a directory"
         | 
| 182 | 
            +
                      end
         | 
| 183 | 
            +
             | 
| 184 | 
            +
                      options[:extra_doc_dirs] << File.expand_path(dir)
         | 
| 186 185 | 
             
                    end
         | 
| 187 186 | 
             
                  end
         | 
| 188 187 |  | 
| 189 188 | 
             
                  opt.separator nil
         | 
| 190 189 |  | 
| 191 | 
            -
                  opt.on("--[no-] | 
| 192 | 
            -
                         " | 
| 193 | 
            -
             | 
| 190 | 
            +
                  opt.on("--[no-]use-cache",
         | 
| 191 | 
            +
                         "Whether or not to use ri's cache.",
         | 
| 192 | 
            +
                         "True by default.") do |value|
         | 
| 193 | 
            +
                    options[:use_cache] = value
         | 
| 194 194 | 
             
                  end
         | 
| 195 195 |  | 
| 196 196 | 
             
                  opt.separator nil
         | 
| 197 197 |  | 
| 198 | 
            -
                  opt.on("-- | 
| 199 | 
            -
                         " | 
| 200 | 
            -
                         " | 
| 201 | 
            -
             | 
| 198 | 
            +
                  opt.on("--no-standard-docs",
         | 
| 199 | 
            +
                         "Do not include documentation from",
         | 
| 200 | 
            +
                         "the Ruby standard library, site_lib,",
         | 
| 201 | 
            +
                         "installed gems, or ~/.rdoc.",
         | 
| 202 | 
            +
                         "Equivalent to specifying",
         | 
| 203 | 
            +
                         "the options --no-system, --no-site, --no-gems,",
         | 
| 204 | 
            +
                         "and --no-home") do
         | 
| 205 | 
            +
                    options[:use_system] = false
         | 
| 206 | 
            +
                    options[:use_site] = false
         | 
| 207 | 
            +
                    options[:use_gems] = false
         | 
| 208 | 
            +
                    options[:use_home] = false
         | 
| 202 209 | 
             
                  end
         | 
| 203 210 |  | 
| 204 211 | 
             
                  opt.separator nil
         | 
| 205 212 |  | 
| 206 | 
            -
                  opt.on("--no- | 
| 207 | 
            -
                         " | 
| 208 | 
            -
             | 
| 213 | 
            +
                  opt.on("--[no-]system",
         | 
| 214 | 
            +
                         "Include documentation from Ruby's standard",
         | 
| 215 | 
            +
                         "library.  Defaults to true.") do |value|
         | 
| 216 | 
            +
                    options[:use_system] = value
         | 
| 209 217 | 
             
                  end
         | 
| 210 218 |  | 
| 211 219 | 
             
                  opt.separator nil
         | 
| 212 220 |  | 
| 213 221 | 
             
                  opt.on("--[no-]site",
         | 
| 214 222 | 
             
                         "Include documentation from libraries",
         | 
| 215 | 
            -
                         "installed in site_lib." | 
| 216 | 
            -
             | 
| 223 | 
            +
                         "installed in site_lib.",
         | 
| 224 | 
            +
                         "Defaults to true.") do |value|
         | 
| 225 | 
            +
                    options[:use_site] = value
         | 
| 217 226 | 
             
                  end
         | 
| 218 227 |  | 
| 219 228 | 
             
                  opt.separator nil
         | 
| 220 229 |  | 
| 221 | 
            -
                  opt.on("--[no-] | 
| 222 | 
            -
                         "Include documentation from  | 
| 223 | 
            -
                         " | 
| 224 | 
            -
                     | 
| 230 | 
            +
                  opt.on("--[no-]gems",
         | 
| 231 | 
            +
                         "Include documentation from RubyGems.",
         | 
| 232 | 
            +
                         "Defaults to true.") do |value|
         | 
| 233 | 
            +
                    options[:use_gems] = value
         | 
| 234 | 
            +
                  end
         | 
| 235 | 
            +
             | 
| 236 | 
            +
                  opt.separator nil
         | 
| 237 | 
            +
             | 
| 238 | 
            +
                  opt.on("--[no-]home",
         | 
| 239 | 
            +
                         "Include documentation stored in ~/.rdoc.",
         | 
| 240 | 
            +
                         "Defaults to true.") do |value|
         | 
| 241 | 
            +
                    options[:use_home] = value
         | 
| 242 | 
            +
                  end
         | 
| 243 | 
            +
             | 
| 244 | 
            +
                  opt.separator nil
         | 
| 245 | 
            +
             | 
| 246 | 
            +
                  opt.on("--list-doc-dirs",
         | 
| 247 | 
            +
                         "List the directories from which ri will",
         | 
| 248 | 
            +
                         "source documentation on stdout and exit.") do
         | 
| 249 | 
            +
                    options[:list_doc_dirs] = true
         | 
| 250 | 
            +
                  end
         | 
| 251 | 
            +
             | 
| 252 | 
            +
                  opt.separator nil
         | 
| 253 | 
            +
             | 
| 254 | 
            +
                  opt.on("--list-names", "-l",
         | 
| 255 | 
            +
                         "List all the names known to RDoc, one per",
         | 
| 256 | 
            +
                         "line.") do
         | 
| 257 | 
            +
                    options[:list_names] = true
         | 
| 258 | 
            +
                  end
         | 
| 259 | 
            +
             | 
| 260 | 
            +
                  opt.separator nil
         | 
| 261 | 
            +
             | 
| 262 | 
            +
                  opt.on("--no-pager", "-T",
         | 
| 263 | 
            +
                         "Send output directly to stdout,",
         | 
| 264 | 
            +
                         "rather than to a pager.") do
         | 
| 265 | 
            +
                    options[:use_stdout] = true
         | 
| 266 | 
            +
                  end
         | 
| 267 | 
            +
             | 
| 268 | 
            +
                  opt.on("--interactive", "-i",
         | 
| 269 | 
            +
                         "This makes ri go into interactive mode.",
         | 
| 270 | 
            +
                         "When ri is in interactive mode it will",
         | 
| 271 | 
            +
                         "allow the user to disambiguate lists of",
         | 
| 272 | 
            +
                         "methods in case multiple methods match",
         | 
| 273 | 
            +
                         "against a method search string.  It also",
         | 
| 274 | 
            +
                         "will allow the user to enter in a method",
         | 
| 275 | 
            +
                         "name (with auto-completion, if readline",
         | 
| 276 | 
            +
                         "is supported) when viewing a class.") do
         | 
| 277 | 
            +
                    options[:interactive] = true
         | 
| 225 278 | 
             
                  end
         | 
| 226 279 |  | 
| 227 280 | 
             
                  opt.separator nil
         | 
| @@ -238,10 +291,10 @@ Options may also be set in the 'RI' environment variable. | |
| 238 291 |  | 
| 239 292 | 
             
                options[:names] = argv
         | 
| 240 293 |  | 
| 241 | 
            -
                options[: | 
| 242 | 
            -
             | 
| 243 | 
            -
                options[: | 
| 244 | 
            -
             | 
| 294 | 
            +
                options[:formatter] ||= RDoc::RI::Formatter.for('plain')
         | 
| 295 | 
            +
                options[:use_stdout] ||= !$stdout.tty?
         | 
| 296 | 
            +
                options[:use_stdout] ||= options[:interactive]
         | 
| 297 | 
            +
                options[:width] ||= 72
         | 
| 245 298 |  | 
| 246 299 | 
             
                options
         | 
| 247 300 |  | 
| @@ -259,21 +312,28 @@ Options may also be set in the 'RI' environment variable. | |
| 259 312 | 
             
              end
         | 
| 260 313 |  | 
| 261 314 | 
             
              def initialize(options={})
         | 
| 262 | 
            -
                options[:formatter] ||= RDoc::RI::Formatter.for('plain')
         | 
| 263 | 
            -
                options[:use_stdout] ||= !$stdout.tty?
         | 
| 264 | 
            -
                options[:width] ||= 72
         | 
| 265 315 | 
             
                @names = options[:names]
         | 
| 266 316 |  | 
| 267 317 | 
             
                @class_cache_name = 'classes'
         | 
| 268 | 
            -
             | 
| 318 | 
            +
             | 
| 319 | 
            +
                @doc_dirs = RDoc::RI::Paths.path(options[:use_system],
         | 
| 320 | 
            +
                                                 options[:use_site],
         | 
| 321 | 
            +
                                                 options[:use_home],
         | 
| 322 | 
            +
                                                 options[:use_gems],
         | 
| 323 | 
            +
                                                 options[:extra_doc_dirs])
         | 
| 324 | 
            +
             | 
| 269 325 | 
             
                @homepath = RDoc::RI::Paths.raw_path(false, false, true, false).first
         | 
| 270 326 | 
             
                @homepath = @homepath.sub(/\.rdoc/, '.ri')
         | 
| 271 | 
            -
                @ | 
| 327 | 
            +
                @sys_dir = RDoc::RI::Paths.raw_path(true, false, false, false).first
         | 
| 328 | 
            +
                @list_doc_dirs = options[:list_doc_dirs]
         | 
| 272 329 |  | 
| 273 330 | 
             
                FileUtils.mkdir_p cache_file_path unless File.directory? cache_file_path
         | 
| 331 | 
            +
                @cache_doc_dirs_path = File.join cache_file_path, ".doc_dirs"
         | 
| 274 332 |  | 
| 333 | 
            +
                @use_cache = options[:use_cache]
         | 
| 275 334 | 
             
                @class_cache = nil
         | 
| 276 335 |  | 
| 336 | 
            +
                @interactive = options[:interactive]
         | 
| 277 337 | 
             
                @display = RDoc::RI::DefaultDisplay.new(options[:formatter],
         | 
| 278 338 | 
             
                                                        options[:width],
         | 
| 279 339 | 
             
                                                        options[:use_stdout])
         | 
| @@ -282,30 +342,92 @@ Options may also be set in the 'RI' environment variable. | |
| 282 342 | 
             
              def class_cache
         | 
| 283 343 | 
             
                return @class_cache if @class_cache
         | 
| 284 344 |  | 
| 285 | 
            -
                 | 
| 345 | 
            +
                # Get the documentation directories used to make the cache in order to see
         | 
| 346 | 
            +
                # whether the cache is valid for the current ri instantiation.
         | 
| 347 | 
            +
                if(File.readable?(@cache_doc_dirs_path))
         | 
| 348 | 
            +
                  cache_doc_dirs = IO.read(@cache_doc_dirs_path).split("\n")
         | 
| 349 | 
            +
                else
         | 
| 350 | 
            +
                  cache_doc_dirs = []
         | 
| 351 | 
            +
                end
         | 
| 352 | 
            +
             | 
| 353 | 
            +
                newest = map_dirs('created.rid') do |f|
         | 
| 286 354 | 
             
                  File.mtime f if test ?f, f
         | 
| 287 355 | 
             
                end.max
         | 
| 288 356 |  | 
| 357 | 
            +
                # An up to date cache file must have been created more recently than
         | 
| 358 | 
            +
                # the last modification of any of the documentation directories.  It also
         | 
| 359 | 
            +
                # must have been created with the same documentation directories
         | 
| 360 | 
            +
                # as those from which ri currently is sourcing documentation.
         | 
| 289 361 | 
             
                up_to_date = (File.exist?(class_cache_file_path) and
         | 
| 290 | 
            -
                              newest and newest < File.mtime(class_cache_file_path) | 
| 362 | 
            +
                              newest and newest < File.mtime(class_cache_file_path) and
         | 
| 363 | 
            +
                              (cache_doc_dirs == @doc_dirs))
         | 
| 364 | 
            +
             | 
| 365 | 
            +
                if up_to_date and @use_cache then
         | 
| 366 | 
            +
                  open class_cache_file_path, 'rb' do |fp|
         | 
| 367 | 
            +
                    begin
         | 
| 368 | 
            +
                      @class_cache = Marshal.load fp.read
         | 
| 369 | 
            +
                    rescue
         | 
| 370 | 
            +
                      #
         | 
| 371 | 
            +
                      # This shouldn't be necessary, since the up_to_date logic above
         | 
| 372 | 
            +
                      # should force the cache to be recreated when a new version of
         | 
| 373 | 
            +
                      # rdoc is installed.  This seems like a worthwhile enhancement
         | 
| 374 | 
            +
                      # to ri's robustness, however.
         | 
| 375 | 
            +
                      #
         | 
| 376 | 
            +
                      $stderr.puts "Error reading the class cache; recreating the class cache!"
         | 
| 377 | 
            +
                      @class_cache = create_class_cache
         | 
| 378 | 
            +
                    end
         | 
| 379 | 
            +
                  end
         | 
| 380 | 
            +
                else
         | 
| 381 | 
            +
                  @class_cache = create_class_cache
         | 
| 382 | 
            +
                end
         | 
| 383 | 
            +
                
         | 
| 384 | 
            +
                @class_cache
         | 
| 385 | 
            +
              end
         | 
| 386 | 
            +
             | 
| 387 | 
            +
              def create_class_cache
         | 
| 388 | 
            +
                class_cache = OpenStructHash.new
         | 
| 291 389 |  | 
| 292 | 
            -
                @ | 
| 293 | 
            -
             | 
| 294 | 
            -
             | 
| 295 | 
            -
             | 
| 390 | 
            +
                if(@use_cache)
         | 
| 391 | 
            +
                  # Dump the documentation directories to a file in the cache, so that
         | 
| 392 | 
            +
                  # we only will use the cache for future instantiations with identical
         | 
| 393 | 
            +
                  # documentation directories.
         | 
| 394 | 
            +
                  File.open @cache_doc_dirs_path, "wb" do |fp|
         | 
| 395 | 
            +
                    fp << @doc_dirs.join("\n")
         | 
| 396 | 
            +
                  end
         | 
| 397 | 
            +
                end
         | 
| 296 398 |  | 
| 297 | 
            -
             | 
| 298 | 
            -
             | 
| 399 | 
            +
                classes = map_dirs('**/cdesc*.yaml') { |f| Dir[f] }
         | 
| 400 | 
            +
                warn "Updating class cache with #{classes.size} classes..."
         | 
| 401 | 
            +
                populate_class_cache class_cache, classes
         | 
| 299 402 |  | 
| 300 | 
            -
             | 
| 301 | 
            -
                                 warn "Updating class cache with #{classes.size} classes..."
         | 
| 403 | 
            +
                write_cache class_cache, class_cache_file_path
         | 
| 302 404 |  | 
| 303 | 
            -
             | 
| 304 | 
            -
             | 
| 305 | 
            -
                               end
         | 
| 405 | 
            +
                class_cache
         | 
| 406 | 
            +
              end
         | 
| 306 407 |  | 
| 307 | 
            -
             | 
| 308 | 
            -
                 | 
| 408 | 
            +
              def populate_class_cache(class_cache, classes, extension = false)
         | 
| 409 | 
            +
                classes.each do |cdesc|
         | 
| 410 | 
            +
                  desc = read_yaml cdesc
         | 
| 411 | 
            +
                  klassname = desc["full_name"]
         | 
| 412 | 
            +
             | 
| 413 | 
            +
                  unless class_cache.has_key? klassname then
         | 
| 414 | 
            +
                    desc["display_name"] = "Class"
         | 
| 415 | 
            +
                    desc["sources"] = [cdesc]
         | 
| 416 | 
            +
                    desc["instance_method_extensions"] = []
         | 
| 417 | 
            +
                    desc["class_method_extensions"] = []
         | 
| 418 | 
            +
                    class_cache[klassname] = desc
         | 
| 419 | 
            +
                  else
         | 
| 420 | 
            +
                    klass = class_cache[klassname]
         | 
| 421 | 
            +
             | 
| 422 | 
            +
                    if extension then
         | 
| 423 | 
            +
                      desc["instance_method_extensions"] = desc.delete "instance_methods"
         | 
| 424 | 
            +
                      desc["class_method_extensions"] = desc.delete "class_methods"
         | 
| 425 | 
            +
                    end
         | 
| 426 | 
            +
             | 
| 427 | 
            +
                    klass.merge_enums desc
         | 
| 428 | 
            +
                    klass["sources"] << cdesc
         | 
| 429 | 
            +
                  end
         | 
| 430 | 
            +
                end
         | 
| 309 431 | 
             
              end
         | 
| 310 432 |  | 
| 311 433 | 
             
              def class_cache_file_path
         | 
| @@ -322,8 +444,11 @@ Options may also be set in the 'RI' environment variable. | |
| 322 444 |  | 
| 323 445 | 
             
              def display_class(name)
         | 
| 324 446 | 
             
                klass = class_cache[name]
         | 
| 325 | 
            -
                 | 
| 326 | 
            -
             | 
| 447 | 
            +
                @display.display_class_info klass
         | 
| 448 | 
            +
              end
         | 
| 449 | 
            +
             | 
| 450 | 
            +
              def display_method(method)
         | 
| 451 | 
            +
                @display.display_method_info method
         | 
| 327 452 | 
             
              end
         | 
| 328 453 |  | 
| 329 454 | 
             
              def get_info_for(arg)
         | 
| @@ -337,42 +462,59 @@ Options may also be set in the 'RI' environment variable. | |
| 337 462 | 
             
                cache = nil
         | 
| 338 463 |  | 
| 339 464 | 
             
                if File.exist? path and
         | 
| 340 | 
            -
                   File.mtime(path) >= File.mtime(class_cache_file_path)  | 
| 465 | 
            +
                   File.mtime(path) >= File.mtime(class_cache_file_path) and
         | 
| 466 | 
            +
                   @use_cache then
         | 
| 341 467 | 
             
                  open path, 'rb' do |fp|
         | 
| 342 | 
            -
                     | 
| 468 | 
            +
                    begin
         | 
| 469 | 
            +
                      cache = Marshal.load fp.read
         | 
| 470 | 
            +
                    rescue
         | 
| 471 | 
            +
                      #
         | 
| 472 | 
            +
                      # The cache somehow is bad.  Recreate the cache.
         | 
| 473 | 
            +
                      #
         | 
| 474 | 
            +
                      $stderr.puts "Error reading the cache for #{klassname}; recreating the cache!"
         | 
| 475 | 
            +
                      cache = create_cache_for klassname, path
         | 
| 476 | 
            +
                    end
         | 
| 343 477 | 
             
                  end
         | 
| 344 478 | 
             
                else
         | 
| 345 | 
            -
                   | 
| 479 | 
            +
                  cache = create_cache_for klassname, path
         | 
| 480 | 
            +
                end
         | 
| 346 481 |  | 
| 347 | 
            -
             | 
| 348 | 
            -
             | 
| 349 | 
            -
             | 
| 482 | 
            +
                cache
         | 
| 483 | 
            +
              end
         | 
| 484 | 
            +
             | 
| 485 | 
            +
              def create_cache_for(klassname, path)
         | 
| 486 | 
            +
                klass = class_cache[klassname]
         | 
| 487 | 
            +
                return nil unless klass
         | 
| 488 | 
            +
             | 
| 489 | 
            +
                method_files = klass["sources"]
         | 
| 490 | 
            +
                cache = OpenStructHash.new
         | 
| 350 491 |  | 
| 351 | 
            -
             | 
| 352 | 
            -
                   | 
| 353 | 
            -
             | 
| 354 | 
            -
             | 
| 355 | 
            -
             | 
| 356 | 
            -
             | 
| 357 | 
            -
             | 
| 358 | 
            -
             | 
| 359 | 
            -
                    system_file  | 
| 360 | 
            -
             | 
| 361 | 
            -
             | 
| 362 | 
            -
                       | 
| 363 | 
            -
             | 
| 364 | 
            -
                       | 
| 365 | 
            -
             | 
| 366 | 
            -
                       | 
| 367 | 
            -
             | 
| 368 | 
            -
                       | 
| 492 | 
            +
                method_files.each do |f|
         | 
| 493 | 
            +
                  system_file = f.index(@sys_dir) == 0
         | 
| 494 | 
            +
                  Dir[File.join(File.dirname(f), "*")].each do |yaml|
         | 
| 495 | 
            +
                    next unless yaml =~ /yaml$/
         | 
| 496 | 
            +
                    next if yaml =~ /cdesc-[^\/]+yaml$/
         | 
| 497 | 
            +
             | 
| 498 | 
            +
                    method = read_yaml yaml
         | 
| 499 | 
            +
             | 
| 500 | 
            +
                    if system_file then
         | 
| 501 | 
            +
                      method["source_path"] = "Ruby #{RDoc::RI::Paths::VERSION}"
         | 
| 502 | 
            +
                    else
         | 
| 503 | 
            +
                      if(f =~ %r%gems/[\d.]+/doc/([^/]+)%) then
         | 
| 504 | 
            +
                        ext_path = "gem #{$1}"
         | 
| 505 | 
            +
                      else
         | 
| 506 | 
            +
                        ext_path = f
         | 
| 507 | 
            +
                      end
         | 
| 508 | 
            +
             | 
| 509 | 
            +
                      method["source_path"] = ext_path
         | 
| 369 510 | 
             
                    end
         | 
| 370 | 
            -
                  end
         | 
| 371 511 |  | 
| 372 | 
            -
             | 
| 512 | 
            +
                    name = method["full_name"]
         | 
| 513 | 
            +
                    cache[name] = method
         | 
| 514 | 
            +
                  end
         | 
| 373 515 | 
             
                end
         | 
| 374 | 
            -
             | 
| 375 | 
            -
                 | 
| 516 | 
            +
                
         | 
| 517 | 
            +
                write_cache cache, path
         | 
| 376 518 | 
             
              end
         | 
| 377 519 |  | 
| 378 520 | 
             
              ##
         | 
| @@ -406,20 +548,10 @@ Options may also be set in the 'RI' environment variable. | |
| 406 548 | 
             
                method
         | 
| 407 549 | 
             
              end
         | 
| 408 550 |  | 
| 409 | 
            -
              def map_dirs(file_name | 
| 410 | 
            -
                 | 
| 411 | 
            -
                         @all_dirs
         | 
| 412 | 
            -
                       else
         | 
| 413 | 
            -
                         if system then
         | 
| 414 | 
            -
                           @sys_dirs
         | 
| 415 | 
            -
                         else
         | 
| 416 | 
            -
                           @all_dirs - @sys_dirs
         | 
| 417 | 
            -
                         end
         | 
| 418 | 
            -
                       end
         | 
| 419 | 
            -
             | 
| 420 | 
            -
                dirs.map { |dir| yield File.join(dir, file_name) }.flatten.compact
         | 
| 551 | 
            +
              def map_dirs(file_name)
         | 
| 552 | 
            +
                @doc_dirs.map { |dir| yield File.join(dir, file_name) }.flatten.compact
         | 
| 421 553 | 
             
              end
         | 
| 422 | 
            -
             | 
| 554 | 
            +
              
         | 
| 423 555 | 
             
              ##
         | 
| 424 556 | 
             
              # Extract the class and method name parts from +name+ like Foo::Bar#baz
         | 
| 425 557 |  | 
| @@ -436,83 +568,66 @@ Options may also be set in the 'RI' environment variable. | |
| 436 568 | 
             
                [klass, meth]
         | 
| 437 569 | 
             
              end
         | 
| 438 570 |  | 
| 439 | 
            -
              def populate_class_cache(class_cache, classes, extension = false)
         | 
| 440 | 
            -
                classes.each do |cdesc|
         | 
| 441 | 
            -
                  desc = read_yaml cdesc
         | 
| 442 | 
            -
                  klassname = desc["full_name"]
         | 
| 443 | 
            -
             | 
| 444 | 
            -
                  unless class_cache.has_key? klassname then
         | 
| 445 | 
            -
                    desc["display_name"] = "Class"
         | 
| 446 | 
            -
                    desc["sources"] = [cdesc]
         | 
| 447 | 
            -
                    desc["instance_method_extensions"] = []
         | 
| 448 | 
            -
                    desc["class_method_extensions"] = []
         | 
| 449 | 
            -
                    class_cache[klassname] = desc
         | 
| 450 | 
            -
                  else
         | 
| 451 | 
            -
                    klass = class_cache[klassname]
         | 
| 452 | 
            -
             | 
| 453 | 
            -
                    if extension then
         | 
| 454 | 
            -
                      desc["instance_method_extensions"] = desc.delete "instance_methods"
         | 
| 455 | 
            -
                      desc["class_method_extensions"] = desc.delete "class_methods"
         | 
| 456 | 
            -
                    end
         | 
| 457 | 
            -
             | 
| 458 | 
            -
                    klass = RDoc::RI::Driver::Hash.convert klass
         | 
| 459 | 
            -
             | 
| 460 | 
            -
                    klass.merge_enums desc
         | 
| 461 | 
            -
                    klass["sources"] << cdesc
         | 
| 462 | 
            -
                  end
         | 
| 463 | 
            -
                end
         | 
| 464 | 
            -
              end
         | 
| 465 | 
            -
             | 
| 466 571 | 
             
              def read_yaml(path)
         | 
| 467 572 | 
             
                data = File.read path
         | 
| 573 | 
            +
             | 
| 574 | 
            +
                # Necessary to be backward-compatible with documentation generated
         | 
| 575 | 
            +
                # by earliar RDoc versions.
         | 
| 468 576 | 
             
                data = data.gsub(/ \!ruby\/(object|struct):(RDoc::RI|RI).*/, '')
         | 
| 469 577 | 
             
                data = data.gsub(/ \!ruby\/(object|struct):SM::(\S+)/,
         | 
| 470 578 | 
             
                                 ' !ruby/\1:RDoc::Markup::\2')
         | 
| 471 | 
            -
                YAML.load | 
| 579 | 
            +
                OpenStructHash.convert(YAML.load(data))
         | 
| 472 580 | 
             
              end
         | 
| 473 581 |  | 
| 474 582 | 
             
              def run
         | 
| 475 | 
            -
                if | 
| 583 | 
            +
                if(@list_doc_dirs)
         | 
| 584 | 
            +
                  puts @doc_dirs.join("\n")
         | 
| 585 | 
            +
                elsif @names.empty? then
         | 
| 476 586 | 
             
                  @display.list_known_classes class_cache.keys.sort
         | 
| 477 587 | 
             
                else
         | 
| 478 588 | 
             
                  @names.each do |name|
         | 
| 479 | 
            -
                     | 
| 480 | 
            -
             | 
| 481 | 
            -
                      if | 
| 482 | 
            -
                         | 
| 483 | 
            -
             | 
| 484 | 
            -
                         | 
| 485 | 
            -
             | 
| 486 | 
            -
             | 
| 487 | 
            -
                        orig_name = name
         | 
| 488 | 
            -
             | 
| 489 | 
            -
                        until klass == 'Kernel' do
         | 
| 490 | 
            -
                          method = lookup_method name, klass
         | 
| 491 | 
            -
             | 
| 492 | 
            -
                          break method if method
         | 
| 493 | 
            -
             | 
| 494 | 
            -
                          ancestor = lookup_ancestor klass, orig_klass
         | 
| 495 | 
            -
             | 
| 496 | 
            -
                          break unless ancestor
         | 
| 497 | 
            -
             | 
| 498 | 
            -
                          name = name.sub klass, ancestor
         | 
| 499 | 
            -
                          klass = ancestor
         | 
| 589 | 
            +
                    if class_cache.key? name then
         | 
| 590 | 
            +
                      method_map = display_class name
         | 
| 591 | 
            +
                      if(@interactive)
         | 
| 592 | 
            +
                        method_name = @display.get_class_method_choice(method_map)
         | 
| 593 | 
            +
             | 
| 594 | 
            +
                        if(method_name != nil)
         | 
| 595 | 
            +
                          method = lookup_method "#{name}#{method_name}", name
         | 
| 596 | 
            +
                          display_method method
         | 
| 500 597 | 
             
                        end
         | 
| 501 | 
            -
             | 
| 502 | 
            -
                        raise NotFoundError, orig_name unless method
         | 
| 503 | 
            -
             | 
| 504 | 
            -
                        @display.display_method_info method
         | 
| 505 598 | 
             
                      end
         | 
| 599 | 
            +
                    elsif name =~ /::|\#|\./ then
         | 
| 600 | 
            +
                      klass, = parse_name name
         | 
| 601 | 
            +
                      
         | 
| 602 | 
            +
                      orig_klass = klass
         | 
| 603 | 
            +
                      orig_name = name
         | 
| 604 | 
            +
                      
         | 
| 605 | 
            +
                      loop do
         | 
| 606 | 
            +
                        method = lookup_method name, klass
         | 
| 607 | 
            +
                        
         | 
| 608 | 
            +
                        break method if method
         | 
| 609 | 
            +
                        
         | 
| 610 | 
            +
                        ancestor = lookup_ancestor klass, orig_klass
         | 
| 611 | 
            +
                        
         | 
| 612 | 
            +
                        break unless ancestor
         | 
| 613 | 
            +
                        
         | 
| 614 | 
            +
                        name = name.sub klass, ancestor
         | 
| 615 | 
            +
                        klass = ancestor
         | 
| 616 | 
            +
                      end
         | 
| 617 | 
            +
                      
         | 
| 618 | 
            +
                      raise NotFoundError, orig_name unless method
         | 
| 619 | 
            +
                      
         | 
| 620 | 
            +
                      display_method method
         | 
| 506 621 | 
             
                    else
         | 
| 507 | 
            -
                       | 
| 508 | 
            -
             | 
| 622 | 
            +
                      methods = select_methods(/#{name}/)
         | 
| 623 | 
            +
                      
         | 
| 624 | 
            +
                      if methods.size == 0
         | 
| 625 | 
            +
                        raise NotFoundError, name
         | 
| 626 | 
            +
                      elsif methods.size == 1
         | 
| 627 | 
            +
                        display_method methods[0]
         | 
| 509 628 | 
             
                      else
         | 
| 510 | 
            -
                         | 
| 511 | 
            -
             | 
| 512 | 
            -
                        if methods.size == 0
         | 
| 513 | 
            -
                          raise NotFoundError, name
         | 
| 514 | 
            -
                        elsif methods.size == 1
         | 
| 515 | 
            -
                          @display.display_method_info methods.first
         | 
| 629 | 
            +
                        if(@interactive)
         | 
| 630 | 
            +
                          @display.display_method_list_choice methods
         | 
| 516 631 | 
             
                        else
         | 
| 517 632 | 
             
                          @display.display_method_list methods
         | 
| 518 633 | 
             
                        end
         | 
| @@ -540,12 +655,13 @@ Options may also be set in the 'RI' environment variable. | |
| 540 655 | 
             
              end
         | 
| 541 656 |  | 
| 542 657 | 
             
              def write_cache(cache, path)
         | 
| 543 | 
            -
                 | 
| 544 | 
            -
                   | 
| 658 | 
            +
                if(@use_cache)
         | 
| 659 | 
            +
                  File.open path, "wb" do |cache_file|
         | 
| 660 | 
            +
                    Marshal.dump cache, cache_file
         | 
| 661 | 
            +
                  end
         | 
| 545 662 | 
             
                end
         | 
| 546 | 
            -
             | 
| 663 | 
            +
                  
         | 
| 547 664 | 
             
                cache
         | 
| 548 665 | 
             
              end
         | 
| 549 666 |  | 
| 550 667 | 
             
            end
         | 
| 551 | 
            -
             |