Class: YARD::RegistryStore

Inherits:
Object
  • Object
show all
Defined in:
lib/yard/registry_store.rb

Overview

The data store for the Registry.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeRegistryStore

Returns a new instance of RegistryStore.



11
12
13
14
15
16
17
18
19
20
21
# File 'lib/yard/registry_store.rb', line 11

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

Instance Attribute Details

#checksumsObject (readonly)

Returns the value of attribute checksums.



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

def checksums
  @checksums
end

#fileObject (readonly)

Returns the value of attribute file.



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

def file
  @file
end

#proxy_typesObject (readonly)

Returns the value of attribute proxy_types.



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

def proxy_types
  @proxy_types
end

Instance Method Details

#checksums_pathObject (protected)



179
180
181
# File 'lib/yard/registry_store.rb', line 179

def checksums_path
  @serializer.checksums_path
end

#delete(key) ⇒ Object



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

def delete(key) @store.delete(key.to_sym) 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.



155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/yard/registry_store.rb', line 155

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:



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/yard/registry_store.rb', line 28

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]
  if obj = @serializer.deserialize(key)
    @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



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

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

#load(file = nil) ⇒ Boolean

Returns whether the database was loaded.

Parameters:

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

    the name of the yardoc db to load

Returns:

  • (Boolean)

    whether the database was loaded



84
85
86
87
88
89
90
91
# File 'lib/yard/registry_store.rb', line 84

def load(file = nil)
  @file = file
  @store = {}
  @proxy_types = {}
  @notfound = {}
  @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



100
101
102
103
104
105
106
107
# File 'lib/yard/registry_store.rb', line 100

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



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/yard/registry_store.rb', line 111

def load_all
  return unless @file
  return if @loaded_objects >= @available_objects
  log.debug "Loading entire database: #{@file} ..."
  objects = []
  
  all_disk_objects.sort_by {|x| x.size }.each do |path|
    if obj = @serializer.deserialize(path, true)
      objects << obj
    end
  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_yardocObject (protected)



183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/yard/registry_store.rb', line 183

def load_yardoc
  return false unless @file
  if File.directory?(@file) # new format
    @loaded_objects = 0
    @available_objects = all_disk_objects.size
    load_proxy_types
    load_checksums
    load_root
    true
  elsif File.file?(@file) # old format
    load_yardoc_old
    true
  else
    false
  end
end

#load_yardoc_oldObject (protected)



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

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

#objects_pathObject (protected)



171
172
173
# File 'lib/yard/registry_store.rb', line 171

def objects_path
  @serializer.objects_path
end

#proxy_types_pathObject (protected)



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

def proxy_types_path
  @serializer.proxy_types_path
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:



49
50
51
52
53
54
55
56
# File 'lib/yard/registry_store.rb', line 49

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

#rootCodeObjects::RootObject

Returns the root object.

Returns:



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

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



134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/yard/registry_store.rb', line 134

def save(merge = true, file = nil)
  if file && file != @file
    @file = file
    @serializer = Serializers::YardocSerializer.new(@file)
  end
  destroy unless merge
  values(false).each do |object|
    @serializer.serialize(object)
  end
  write_proxy_types
  write_checksums
  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:



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

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