lib/yard/cli/yri.rb in yard-0.5.8 vs lib/yard/cli/yri.rb in yard-0.6.0

- old
+ new

@@ -1,14 +1,30 @@ require 'rbconfig' module YARD module CLI # A tool to view documentation in the console like `ri` - class YRI < Base + class YRI < Command + # The location in {YARD::CONFIG_DIR} where the YRI cache file is loaded + # from. CACHE_FILE = File.expand_path('~/.yard/yri_cache') + + # A file containing all paths, delimited by newlines, to search for + # yardoc databases. + # @since 0.5.1 SEARCH_PATHS_FILE = File.expand_path('~/.yard/yri_search_paths') + # Default search paths that should be loaded dynamically into YRI. These paths + # take precedence over all other paths ({SEARCH_PATHS_FILE} and RubyGems + # paths). To add a path, call: + # + # DEFAULT_SEARCH_PATHS.push("/path/to/.yardoc") + # + # @return [Array<String>] a list of extra search paths + # @since 0.6.0 + DEFAULT_SEARCH_PATHS = [] + # Helper method to run the utility on an instance. # @see #run def self.run(*args) new.run(*args) end def initialize @@ -18,11 +34,15 @@ add_default_paths add_gem_paths load_cache @search_paths.uniq! end - + + def description + "A tool to view documentation in the console like `ri`" + end + # Runs the command-line utility. # # @example # YRI.new.run('String#reverse') # @param [Array<String>] args each tokenized argument @@ -46,15 +66,20 @@ end end protected + # Prints the command usage + # @return [void] + # @since 0.5.6 def print_usage puts "Usage: yri [options] <Path to object>" puts "See yri --help for more options." end + # Caches the .yardoc file where an object can be found in the {CACHE_FILE} + # @return [void] def cache_object(name, path) return if path == Registry.yardoc_file @cache[name] = path File.open!(CACHE_FILE, 'w') do |file| @@ -62,19 +87,27 @@ file.puts("#{key} #{value}") end end end + # @param [CodeObjects::Base] object the object to print. + # @return [String] the formatted output for an object. def print_object(object) if object.type == :method && object.is_alias? tmp = P(object.namespace, (object.scope == :instance ? "#" : "") + object.namespace.aliases[object].to_s) object = tmp unless YARD::CodeObjects::Proxy === tmp end object.format(:serializer => @serializer) end + # Locates an object by name starting in the cached paths and then + # searching through any search paths. + # + # @param [String] name the full name of the object + # @return [CodeObjects::Base] an object if found + # @return [nil] if no object is found def find_object(name) @search_paths.unshift(@cache[name]) if @cache[name] @search_paths.unshift(Registry.yardoc_file) log.debug "Searching for #{name} in search paths" @@ -91,33 +124,41 @@ nil end private + # Loads {CACHE_FILE} + # @return [void] def load_cache return unless File.file?(CACHE_FILE) File.readlines(CACHE_FILE).each do |line| line = line.strip.split(/\s+/) @cache[line[0]] = line[1] end end + # Adds all RubyGems yardoc files to search paths + # @return [void] def add_gem_paths require 'rubygems' + gem_paths = [] Gem.source_index.find_name('').each do |spec| if yfile = Registry.yardoc_file_for_gem(spec.name) if spec.name =~ /^yard-doc-/ - @search_paths.unshift(yfile) + gem_paths.unshift(yfile) else - @search_paths.push(yfile) + gem_paths.push(yfile) end end end + @search_paths += gem_paths rescue LoadError end # Adds paths in {SEARCH_PATHS_FILE} + # @since 0.5.1 def add_default_paths + @search_paths.push(*DEFAULT_SEARCH_PATHS) return unless File.file?(SEARCH_PATHS_FILE) paths = File.readlines(SEARCH_PATHS_FILE).map {|l| l.strip } @search_paths.push(*paths) end \ No newline at end of file