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



14
15
16
17
18
19
20
21
22
23
24
25
26
# 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

#checksumsObject (readonly)

Returns the value of attribute checksums.



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

def checksums
  @checksums
end

#fileObject (readonly)

Returns the value of attribute file.



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

def file
  @file
end

#proxy_typesObject (readonly)

Deprecated.

The registry no longer tracks proxy types



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

def proxy_types
  @proxy_types
end

Instance Method Details

#checksums_pathObject (protected)



243
244
245
# File 'lib/yard/registry_store.rb', line 243

def checksums_path
  @serializer.checksums_path
end

#delete(key) ⇒ void

This method returns an undefined value.

Deletes an object at a given path



75
76
77
78
79
80
# 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



218
219
220
221
222
223
224
225
226
227
228
229
230
# 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



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 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



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

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

#load(file = nil) ⇒ Boolean



128
129
130
131
132
133
# 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.

See Also:

Since:

  • 0.5.1



142
143
144
145
146
147
148
149
# 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



153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# 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_yardocObject (protected)



251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
# File 'lib/yard/registry_store.rb', line 251

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
    load_object_types
    true
  elsif File.file?(@file) # old format
    load_yardoc_old
    true
  else
    false
  end
end

#locale(name) ⇒ I18n::Locale

Returns the locale object for name.

Since:

  • 0.8.3



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

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

#lock_for_writing(file = nil, &block) ⇒ Object

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



201
202
203
# 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



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

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

#object_types_pathObject (protected)



247
248
249
# File 'lib/yard/registry_store.rb', line 247

def object_types_path
  @serializer.object_types_path
end

#objects_pathObject (protected)



234
235
236
# File 'lib/yard/registry_store.rb', line 234

def objects_path
  @serializer.objects_path
end

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

Returns a list of object paths with a given CodeObjects::Base#type.

Since:

  • 0.8.0



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

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

#proxy_types_pathObject (protected)

Deprecated.

The registry no longer tracks proxy types



239
240
241
# File 'lib/yard/registry_store.rb', line 239

def proxy_types_path
  @serializer.proxy_types_path
end

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

Associates an object with a path



55
56
57
58
59
60
61
62
63
64
65
66
67
# 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



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

def root; @store[:root] end

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

Saves the database to disk



177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
# 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



96
# 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>

Returns a list of objects with a given CodeObjects::Base#type.

Since:

  • 0.8.0



111
112
113
114
# 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