A set of rdoc data for a single project (gem, path, etc.).
The store manages reading and writing ri data for a project and maintains a cache of methods, classes and ancestors in the store.
The store maintains a cache
of its contents for faster lookup. After adding items to the store it must be flushed using save_cache
. The cache contains the following structures:
@cache = { :ancestors => {}, :attributes => {}, :class_methods => {}, :instance_methods => {}, :modules => [], :pages => [], }Constants
c_class_variables[R]
Maps C variables to class or module names for each parsed C file.
c_singleton_class_variables[R]
Maps C variables to singleton class names for each parsed C file.
cache[R]
The contents of the Store
dry_run[RW]
If true this Store
will not write any files
encoding[RW]
The encoding of the contents in the Store
path[RW]
Path this store reads or writes
rdoc[RW]
The RDoc::RDoc
driver for this parse tree. This allows classes consulting the documentation tree to access user-set options, for example.
type[RW]
Type of ri datastore this was loaded from. See RDoc::RI::Driver, RDoc::RI::Paths.
unmatched_constant_alias[R]
The lazy constants alias will be discovered in passing
Public Class Methodsnew(path = nil, type = nil) click to toggle source
Creates a new Store
of type
that will load or save to path
def initialize path = nil, type = nil @dry_run = false @encoding = nil @path = path @rdoc = nil @type = type @cache = { :ancestors => {}, :attributes => {}, :class_methods => {}, :c_class_variables => {}, :c_singleton_class_variables => {}, :encoding => @encoding, :instance_methods => {}, :main => nil, :modules => [], :pages => [], :title => nil, } @classes_hash = {} @modules_hash = {} @files_hash = {} @text_files_hash = {} @c_enclosure_classes = {} @c_enclosure_names = {} @c_class_variables = {} @c_singleton_class_variables = {} @unique_classes = nil @unique_modules = nil @unmatched_constant_alias = {} endPublic Instance Methods
add_c_enclosure(variable, namespace) click to toggle source
Adds module
as an enclosure (namespace) for the given variable
for C files.
def add_c_enclosure variable, namespace @c_enclosure_classes[variable] = namespace end
add_c_variables(c_parser) click to toggle source
Adds C variables from an RDoc::Parser::C
def add_c_variables c_parser filename = c_parser.top_level.relative_name @c_class_variables[filename] = make_variable_map c_parser.classes @c_singleton_class_variables[filename] = c_parser.singleton_classes end
add_file(absolute_name, relative_name: absolute_name, parser: nil) click to toggle source
Adds the file with name
as an RDoc::TopLevel
to the store. Returns the created RDoc::TopLevel
.
def add_file absolute_name, relative_name: absolute_name, parser: nil unless top_level = @files_hash[relative_name] then top_level = RDoc::TopLevel.new absolute_name, relative_name top_level.parser = parser if parser top_level.store = self @files_hash[relative_name] = top_level @text_files_hash[relative_name] = top_level if top_level.text? end top_level end
all_classes() click to toggle source
Returns all classes discovered by RDoc
def all_classes @classes_hash.values end
all_classes_and_modules() click to toggle source
Returns all classes and modules discovered by RDoc
def all_classes_and_modules @classes_hash.values + @modules_hash.values end
all_files() click to toggle source
All TopLevels known to RDoc
def all_files @files_hash.values end
all_modules() click to toggle source
Returns all modules discovered by RDoc
def all_modules modules_hash.values end
ancestors() click to toggle source
Ancestors cache accessor. Maps a klass name to an Array
of its ancestors in this store. If Foo in this store inherits from Object
, Kernel
won't be listed (it will be included from ruby's ri store).
def ancestors @cache[:ancestors] end
attributes() click to toggle source
Attributes cache accessor. Maps a class to an Array
of its attributes.
def attributes @cache[:attributes] end
cache_path() click to toggle source
Path to the cache file
def cache_path File.join @path, 'cache.ri' end
class_file(klass_name) click to toggle source
Path to the ri data for klass_name
def class_file klass_name name = klass_name.split('::').last File.join class_path(klass_name), "cdesc-#{name}.ri" end
class_methods() click to toggle source
Class
methods cache accessor. Maps a class to an Array
of its class methods (not full name).
def class_methods @cache[:class_methods] end
class_path(klass_name) click to toggle source
Path where data for klass_name
will be stored (methods or class data)
def class_path klass_name File.join @path, *klass_name.split('::') end
classes_hash() click to toggle source
Hash
of all classes known to RDoc
def classes_hash @classes_hash end
complete(min_visibility) click to toggle source
Prepares the RDoc
code object tree for use by a generator.
It finds unique classes/modules defined, and replaces classes/modules that are aliases for another one by a copy with RDoc::ClassModule#is_alias_for
set.
It updates the RDoc::ClassModule#constant_aliases
attribute of ârealâ classes or modules.
It also completely removes the classes and modules that should be removed from the documentation and the methods that have a visibility below min_visibility
, which is the --visibility
option.
See also RDoc::Context#remove_from_documentation?
def complete min_visibility fix_basic_object_inheritance all_classes_and_modules.each { |cm| cm.ancestors } unless min_visibility == :nodoc then remove_nodoc @classes_hash remove_nodoc @modules_hash end @unique_classes = find_unique @classes_hash @unique_modules = find_unique @modules_hash unique_classes_and_modules.each do |cm| cm.complete min_visibility end @files_hash.each_key do |file_name| tl = @files_hash[file_name] unless tl.text? then tl.modules_hash.clear tl.classes_hash.clear tl.classes_or_modules.each do |cm| name = cm.full_name if cm.type == 'class' then tl.classes_hash[name] = cm if @classes_hash[name] else tl.modules_hash[name] = cm if @modules_hash[name] end end end end end
files_hash() click to toggle source
Hash
of all files known to RDoc
def files_hash @files_hash end
find_c_enclosure(variable) click to toggle source
Finds the enclosure (namespace) for the given C variable
.
def find_c_enclosure variable @c_enclosure_classes.fetch variable do break unless name = @c_enclosure_names[variable] mod = find_class_or_module name unless mod then loaded_mod = load_class_data name file = loaded_mod.in_files.first return unless file file.store = self mod = file.add_module RDoc::NormalModule, name end @c_enclosure_classes[variable] = mod end end
find_class_named(name) click to toggle source
Finds the class with name
in all discovered classes
def find_class_named name @classes_hash[name] end
find_class_named_from(name, from) click to toggle source
Finds the class with name
starting in namespace from
def find_class_named_from name, from from = find_class_named from unless RDoc::Context === from until RDoc::TopLevel === from do return nil unless from klass = from.find_class_named name return klass if klass from = from.parent end find_class_named name end
find_class_or_module(name) click to toggle source
Finds the class or module with name
def find_class_or_module name name = $' if name =~ /^::/ @classes_hash[name] || @modules_hash[name] end
find_file_named(name) click to toggle source
Finds the file with name
in all discovered files
def find_file_named name @files_hash[name] end
find_module_named(name) click to toggle source
Finds the module with name
in all discovered modules
def find_module_named name @modules_hash[name] end
find_text_page(file_name) click to toggle source
Returns the RDoc::TopLevel
that is a text file and has the given file_name
def find_text_page file_name @text_files_hash.each_value.find do |file| file.full_name == file_name end end
find_unique(all_hash) click to toggle source
Finds unique classes/modules defined in all_hash
, and returns them as an array. Performs the alias updates in all_hash
: see ::complete.
def find_unique all_hash unique = [] all_hash.each_pair do |full_name, cm| unique << cm if full_name == cm.full_name end unique end
fix_basic_object_inheritance() click to toggle source
Fixes the erroneous BasicObject < Object
in 1.9.
Because we assumed all classes without a stated superclass inherit from Object
, we have the above wrong inheritance.
We fix BasicObject
right away if we are running in a Ruby version >= 1.9.
def fix_basic_object_inheritance basic = classes_hash['BasicObject'] return unless basic basic.superclass = nil end
friendly_path() click to toggle source
Friendly rendition of path
def friendly_path case type when :gem then parent = File.expand_path '..', @path "gem #{File.basename parent}" when :home then RDoc.home when :site then 'ruby site' when :system then 'ruby core' else @path end end
instance_methods() click to toggle source
Instance methods cache accessor. Maps a class to an Array
of its instance methods (not full name).
def instance_methods @cache[:instance_methods] end
load_all() click to toggle source
Loads all items from this store into memory. This recreates a documentation tree for use by a generator
def load_all load_cache module_names.each do |module_name| mod = find_class_or_module(module_name) || load_class(module_name) loaded_methods = mod.method_list.map do |method| load_method module_name, method.full_name end mod.method_list.replace loaded_methods loaded_attributes = mod.attributes.map do |attribute| load_method module_name, attribute.full_name end mod.attributes.replace loaded_attributes end all_classes_and_modules.each do |mod| descendent_re = /^#{mod.full_name}::[^:]+$/ module_names.each do |name| next unless name =~ descendent_re descendent = find_class_or_module name case descendent when RDoc::NormalClass then mod.classes_hash[name] = descendent when RDoc::NormalModule then mod.modules_hash[name] = descendent end end end @cache[:pages].each do |page_name| page = load_page page_name @files_hash[page_name] = page @text_files_hash[page_name] = page if page.text? end end
load_cache() click to toggle source
Loads cache file for this store
def load_cache @cache = marshal_load(cache_path) load_enc = @cache[:encoding] @encoding = load_enc unless @encoding @cache[:pages] ||= [] @cache[:main] ||= nil @cache[:c_class_variables] ||= {} @cache[:c_singleton_class_variables] ||= {} @cache[:c_class_variables].each do |_, map| map.each do |variable, name| @c_enclosure_names[variable] = name end end @cache rescue Errno::ENOENT end
load_class(klass_name) click to toggle source
Loads ri data for klass_name
and hooks it up to this store.
def load_class klass_name obj = load_class_data klass_name obj.store = self case obj when RDoc::NormalClass then @classes_hash[klass_name] = obj when RDoc::SingleClass then @classes_hash[klass_name] = obj when RDoc::NormalModule then @modules_hash[klass_name] = obj end end
load_class_data(klass_name) click to toggle source
Loads ri data for klass_name
def load_class_data klass_name file = class_file klass_name marshal_load(file) rescue Errno::ENOENT => e error = MissingFileError.new(self, file, klass_name) error.set_backtrace e.backtrace raise error end
load_method(klass_name, method_name) click to toggle source
Loads ri data for method_name
in klass_name
def load_method klass_name, method_name file = method_file klass_name, method_name obj = marshal_load(file) obj.store = self obj.parent ||= find_class_or_module(klass_name) || load_class(klass_name) obj rescue Errno::ENOENT => e error = MissingFileError.new(self, file, klass_name + method_name) error.set_backtrace e.backtrace raise error end
load_page(page_name) click to toggle source
Loads ri data for page_name
def load_page page_name file = page_file page_name obj = marshal_load(file) obj.store = self obj rescue Errno::ENOENT => e error = MissingFileError.new(self, file, page_name) error.set_backtrace e.backtrace raise error end
main() click to toggle source
Gets the main page for this RDoc
store. This page is used as the root of the RDoc
server.
def main @cache[:main] end
main=(page) click to toggle source
Sets the main page for this RDoc
store.
def main= page @cache[:main] = page end
make_variable_map(variables) click to toggle source
Converts the variable => ClassModule map variables
from a C parser into a variable => class name map.
def make_variable_map variables map = {} variables.each { |variable, class_module| map[variable] = class_module.full_name } map end
method_file(klass_name, method_name) click to toggle source
Path to the ri data for method_name
in klass_name
def method_file klass_name, method_name method_name = method_name.split('::').last method_name =~ /#(.*)/ method_type = $1 ? 'i' : 'c' method_name = $1 if $1 method_name = method_name.gsub(/\W/) { "%%%02x" % $&[0].ord } File.join class_path(klass_name), "#{method_name}-#{method_type}.ri" end
module_names() click to toggle source
Modules cache accessor. An Array
of all the module (and class) names in the store.
def module_names @cache[:modules] end
modules_hash() click to toggle source
Hash
of all modules known to RDoc
def modules_hash @modules_hash end
page(name) click to toggle source
Returns the RDoc::TopLevel
that is a text file and has the given name
def page name @text_files_hash.each_value.find do |file| file.page_name == name or file.base_name == name end end
page_file(page_name) click to toggle source
Path to the ri data for page_name
def page_file page_name file_name = File.basename(page_name).gsub('.', '_') File.join @path, File.dirname(page_name), "page-#{file_name}.ri" end
remove_nodoc(all_hash) click to toggle source
Removes from all_hash
the contexts that are nodoc or have no content.
See RDoc::Context#remove_from_documentation?
def remove_nodoc all_hash all_hash.keys.each do |name| context = all_hash[name] all_hash.delete(name) if context.remove_from_documentation? end end
save() click to toggle source
Saves all entries in the store
def save load_cache all_classes_and_modules.each do |klass| save_class klass klass.each_method do |method| save_method klass, method end klass.each_attribute do |attribute| save_method klass, attribute end end all_files.each do |file| save_page file end save_cache end
save_cache() click to toggle source
Writes the cache file for this store
def save_cache clean_cache_collection @cache[:ancestors] clean_cache_collection @cache[:attributes] clean_cache_collection @cache[:class_methods] clean_cache_collection @cache[:instance_methods] @cache[:modules].uniq! @cache[:modules].sort! @cache[:pages].uniq! @cache[:pages].sort! @cache[:encoding] = @encoding @cache[:c_class_variables].merge! @c_class_variables @cache[:c_singleton_class_variables].merge! @c_singleton_class_variables return if @dry_run File.open cache_path, 'wb' do |io| Marshal.dump @cache, io end end
save_class(klass) click to toggle source
Writes the ri data for klass
(or module)
def save_class klass full_name = klass.full_name FileUtils.mkdir_p class_path(full_name) unless @dry_run @cache[:modules] << full_name path = class_file full_name begin disk_klass = load_class full_name klass = disk_klass.merge klass rescue MissingFileError end ancestors = klass.direct_ancestors.compact.map do |ancestor| String === ancestor ? ancestor : ancestor.full_name end @cache[:ancestors][full_name] ||= [] @cache[:ancestors][full_name].concat ancestors attribute_definitions = klass.attributes.map do |attribute| "#{attribute.definition} #{attribute.name}" end unless attribute_definitions.empty? then @cache[:attributes][full_name] ||= [] @cache[:attributes][full_name].concat attribute_definitions end to_delete = [] unless klass.method_list.empty? then @cache[:class_methods][full_name] ||= [] @cache[:instance_methods][full_name] ||= [] class_methods, instance_methods = klass.method_list.partition { |meth| meth.singleton } class_methods = class_methods. map { |method| method.name } instance_methods = instance_methods.map { |method| method.name } attribute_names = klass.attributes.map { |attr| attr.name } old = @cache[:class_methods][full_name] - class_methods to_delete.concat old.map { |method| method_file full_name, "#{full_name}::#{method}" } old = @cache[:instance_methods][full_name] - instance_methods - attribute_names to_delete.concat old.map { |method| method_file full_name, "#{full_name}##{method}" } @cache[:class_methods][full_name] = class_methods @cache[:instance_methods][full_name] = instance_methods end return if @dry_run FileUtils.rm_f to_delete File.open path, 'wb' do |io| Marshal.dump klass, io end end
save_method(klass, method) click to toggle source
Writes the ri data for method
on klass
def save_method klass, method full_name = klass.full_name FileUtils.mkdir_p class_path(full_name) unless @dry_run cache = if method.singleton then @cache[:class_methods] else @cache[:instance_methods] end cache[full_name] ||= [] cache[full_name] << method.name return if @dry_run File.open method_file(full_name, method.full_name), 'wb' do |io| Marshal.dump method, io end end
save_page(page) click to toggle source
Writes the ri data for page
def save_page page return unless page.text? path = page_file page.full_name FileUtils.mkdir_p File.dirname(path) unless @dry_run cache[:pages] ||= [] cache[:pages] << page.full_name return if @dry_run File.open path, 'wb' do |io| Marshal.dump page, io end end
source() click to toggle source
Source of the contents of this store.
For a store from a gem the source is the gem name. For a store from the home directory the source is âhomeâ. For system ri store (the standard library documentation) the source isârubyâ. For a store from the site ri directory the store is âsiteâ. For other stores the source is the path
.
def source case type when :gem then File.basename File.expand_path '..', @path when :home then 'home' when :site then 'site' when :system then 'ruby' else @path end end
title() click to toggle source
Gets the title for this RDoc
store. This is used as the title in each page on the RDoc
server
def title @cache[:title] end
title=(title) click to toggle source
Sets the title page for this RDoc
store.
def title= title @cache[:title] = title end
unique_classes() click to toggle source
Returns the unique classes discovered by RDoc
.
::complete must have been called prior to using this method.
def unique_classes @unique_classes end
unique_classes_and_modules() click to toggle source
Returns the unique classes and modules discovered by RDoc
. ::complete must have been called prior to using this method.
def unique_classes_and_modules @unique_classes + @unique_modules end
unique_modules() click to toggle source
Returns the unique modules discovered by RDoc
. ::complete must have been called prior to using this method.
def unique_modules @unique_modules end
update_parser_of_file(absolute_name, parser) click to toggle source
def update_parser_of_file(absolute_name, parser) if top_level = @files_hash[absolute_name] then @text_files_hash[absolute_name] = top_level if top_level.text? end endPrivate Instance Methods
marshal_load(file) click to toggle source
def marshal_load(file) File.open(file, 'rb') {|io| Marshal.load(io, MarshalFilter)} end
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4