123456789_123456789_123456789_123456789_123456789_

Class: YARD::RegistryStore

Relationships & Source Files
Inherits: Object
Defined in: lib/yard/registry_store.rb

Overview

The data store for the Registry.

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.newRegistryStore

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 14

def initialize
  @file = nil
  @checksums = {}
  @store = {}
  @proxy_types = {}
  @object_types = {:root => [:root]}
  @notfound = {}
  @loaded_objects = 0
  @available_objects = 0
  @locales = {}
  @store[:root] = CodeObjects::RootObject.allocate
  @store[:root].send(:initialize, nil, :root)
end

Instance Attribute Details

#checksums (readonly)

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 12

attr_reader :file, :checksums

#file (readonly)

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 12

attr_reader :file, :checksums

#proxy_types (readonly)

Deprecated.

The registry no longer tracks proxy types

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 11

attr_reader :proxy_types

Instance Method Details

#[](key)

Alias for #get.

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 69

alias [] get

#[]=(key, value)

Alias for #put.

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 70

alias []= put

#all_disk_objects (private)

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 319

def all_disk_objects
  Dir.glob(File.join(objects_path, '**/*')).select {|f| File.file?(f) }
end

#delete(key) ⇒ void

This method returns an undefined value.

Deletes an object at a given path

Parameters:

  • key (#to_sym)

    the key to delete

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 75

def delete(key)
  if @store[key.to_sym]
    @object_types[@store[key.to_sym].type].delete(key.to_s)
    @store.delete(key.to_sym)
  end
end

#destroy(force = false) ⇒ Boolean

Deletes the .yardoc database on disk

Parameters:

  • force (Boolean) (defaults to: false)

    if force is not set to true, the file/directory will only be removed if it ends with .yardoc. This helps with cases where the directory might have been named incorrectly.

Returns:

  • (Boolean)

    true if the .yardoc database was deleted, false otherwise.

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 218

def destroy(force = false)
  if (!force && file =~ /\.yardoc$/) || force
    if File.file?(@file)
      # Handle silent upgrade of old .yardoc format
      File.unlink(@file)
    elsif File.directory?(@file)
      FileUtils.rm_rf(@file)
    end
    true
  else
    false
  end
end

#get(key) ⇒ CodeObjects::Base? Also known as: #[]

Gets a CodeObjects::Base from the store

Parameters:

  • key (String, Symbol)

    the path name of the object to look for. If it is empty or :root, returns the #root object.

Returns:

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 33

def get(key)
  key = :root if key == ''
  key = key.to_sym
  return @store[key] if @store[key]
  return if @loaded_objects >= @available_objects

  # check disk
  return if @notfound[key]
  obj = @serializer.deserialize(key)
  if obj
    @loaded_objects += 1
    put(key, obj)
  else
    @notfound[key] = true
    nil
  end
end

#keys(reload = false) ⇒ Array<Symbol>

Gets all path names from the store. Loads the entire database if reload is true

Parameters:

  • reload (Boolean) (defaults to: false)

    if false, does not load the entire database before a lookup.

Returns:

  • (Array<Symbol>)

    the path names of all the code objects

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 88

def keys(reload = false) load_all if reload; @store.keys end

#load(file = nil) ⇒ Boolean

Parameters:

  • file (String, nil) (defaults to: nil)

    the name of the yardoc db to load

Returns:

  • (Boolean)

    whether the database was loaded

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 128

def load(file = nil)
  initialize
  @file = file
  @serializer = Serializers::YardocSerializer.new(@file)
  load_yardoc
end

#load!(file = nil) ⇒ Boolean

Loads the .yardoc file and loads all cached objects into memory automatically.

Parameters:

  • file (String, nil) (defaults to: nil)

    the name of the yardoc db to load

Returns:

  • (Boolean)

    whether the database was loaded

See Also:

Since:

  • 0.5.1

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 142

def load!(file = nil)
  if load(file)
    load_all
    true
  else
    false
  end
end

#load_allvoid

This method returns an undefined value.

Loads all cached objects into memory

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 153

def load_all
  return unless @file
  return if @loaded_objects >= @available_objects
  log.debug "Loading entire database: #{@file} ..."
  objects = []

  all_disk_objects.sort_by(&:size).each do |path|
    obj = @serializer.deserialize(path, true)
    objects << obj if obj
  end

  objects.each do |obj|
    put(obj.path, obj)
  end

  @loaded_objects += objects.size
  log.debug "Loaded database (file='#{@file}' count=#{objects.size} total=#{@available_objects})"
end

#load_checksums (private)

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 291

def load_checksums
  return unless File.file?(checksums_path)
  lines = File.readlines(checksums_path).map do |line|
    line.strip.rpartition(' ').tap { |p| p.delete_at(1) }
  end
  @checksums = Hash[lines]
end

#load_locale(name) (private)

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 313

def load_locale(name)
  locale = I18n::Locale.new(name)
  locale.load(Registry.po_dir)
  locale
end

#load_object_types (private)

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 281

def load_object_types
  if File.file?(object_types_path)
    @object_types = Marshal.load(File.read_binary(object_types_path))
  else # migrate db without object_types
    values.each do |object|
      (@object_types[object.type] ||= []) << object.path
    end
  end
end

#load_proxy_types (private)

Deprecated.

The registry no longer tracks proxy types

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 276

def load_proxy_types
  return unless File.file?(proxy_types_path)
  @proxy_types = Marshal.load(File.read_binary(proxy_types_path))
end

#load_root (private)

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 299

def load_root
  root = @serializer.deserialize('root')
  return if root.nil?

  @loaded_objects += 1
  if root.is_a?(Hash) # single object db
    log.debug "Loading single object DB from .yardoc"
    @loaded_objects += (root.keys.size - 1)
    @store = root
  else # just the root object
    @store[:root] = root
  end
end

#load_yardoc_old (private)

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 271

def load_yardoc_old
  @store, @proxy_types = *Marshal.load(File.read_binary(@file))
end

#locale(name) ⇒ I18n::Locale

Parameters:

  • name (String)

    the locale name.

Returns:

Since:

  • 0.8.3

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 122

def locale(name)
  @locales[name] ||= load_locale(name)
end

#lock_for_writing(file = nil, &block)

Creates a pessmistic transactional lock on the database for writing. Use with YARD.parse to ensure the database is not written multiple times.

Parameters:

  • file (String) (defaults to: nil)

    if supplied, the path to the database

See Also:

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 201

def lock_for_writing(file = nil, &block)
  Serializers::YardocSerializer.new(file || @file).lock_for_writing(&block)
end

#locked_for_writing?(file = nil) ⇒ Boolean

Parameters:

  • file (String) (defaults to: nil)

    if supplied, the path to the database

Returns:

  • (Boolean)

    whether the database is currently locked for writing

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 207

def locked_for_writing?(file = nil)
  Serializers::YardocSerializer.new(file || @file).locked_for_writing?
end

#paths_for_type(type, reload = false) ⇒ Array<String>

Parameters:

  • type (Symbol)

    the type to look for

Returns:

Since:

  • 0.8.0

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 102

def paths_for_type(type, reload = false)
  load_all if reload
  @object_types[type] || []
end

#put(key, value) ⇒ CodeObjects::Base Also known as: #[]=

Associates an object with a path

Parameters:

  • key (String, Symbol)

    the path name (:root or '' for root object)

  • value (CodeObjects::Base)

    the object to store

Returns:

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 55

def put(key, value)
  if key == ''
    @object_types[:root] = [:root]
    @store[:root] = value
  else
    @notfound.delete(key.to_sym)
    (@object_types[value.type] ||= []) << key.to_s
    if @store[key.to_sym]
      @object_types[@store[key.to_sym].type].delete(key.to_s)
    end
    @store[key.to_sym] = value
  end
end

#rootCodeObjects::RootObject

Returns:

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 117

def root; @store[:root] end

#save(merge = true, file = nil) ⇒ Boolean

Saves the database to disk

Parameters:

  • merge (Boolean) (defaults to: true)

    if true, merges the data in memory with the data on disk, otherwise the data on disk is deleted.

  • file (String, nil) (defaults to: nil)

    if supplied, the name of the file to save to

Returns:

  • (Boolean)

    whether the database was saved

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 177

def save(merge = true, file = nil)
  if file && file != @file
    @file = file
    @serializer = Serializers::YardocSerializer.new(@file)
  end
  destroy unless merge

  sdb = Registry.single_object_db
  if sdb == true || sdb.nil?
    @serializer.serialize(@store)
  else
    values(false).each do |object|
      @serializer.serialize(object)
    end
  end
  write_proxy_types
  write_object_types
  write_checksums
  write_complete_lock
  true
end

#values(reload = false) ⇒ Array<CodeObjects::Base>

Gets all code objects from the store. Loads the entire database if reload is true

Parameters:

  • reload (Boolean) (defaults to: false)

    if false, does not load the entire database before a lookup.

Returns:

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 96

def values(reload = false) load_all if reload; @store.values end

#values_for_type(type, reload = false) ⇒ Array<CodeObjects::Base>

Parameters:

  • type (Symbol)

    the type to look for

Returns:

Since:

  • 0.8.0

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 111

def values_for_type(type, reload = false)
  load_all if reload
  paths_for_type(type).map {|t| @store[t.to_sym] }
end

#write_checksums (private)

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 332

def write_checksums
  File.open!(checksums_path, 'w') do |f|
    @checksums.each {|k, v| f.puts("#{k} #{v}") }
  end
end

#write_complete_lock (private)

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 338

def write_complete_lock
  File.open!(@serializer.complete_lock_path, 'w') {}
end

#write_object_types (private)

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 328

def write_object_types
  File.open!(object_types_path, 'wb') {|f| f.write(Marshal.dump(@object_types)) }
end

#write_proxy_types (private)

Deprecated.

The registry no longer tracks proxy types

[ GitHub ]

  
# File 'lib/yard/registry_store.rb', line 324

def write_proxy_types
  File.open!(proxy_types_path, 'wb') {|f| f.write(Marshal.dump(@proxy_types)) }
end