class Drydock::ObjectCaches::FilesystemCache

Attributes

dir[R]

Public Class Methods

new(dir = "~/.drydock") click to toggle source
# File lib/drydock/object_caches/filesystem_cache.rb, line 8
def initialize(dir = "~/.drydock")
  @dir = File.expand_path(File.join(dir.to_s, 'cache'))
  FileUtils.mkdir_p(@dir)
end

Public Instance Methods

clear() click to toggle source
# File lib/drydock/object_caches/filesystem_cache.rb, line 13
def clear
  begin
    FileUtils.remove_entry(@dir)
    true
  rescue => e
    Drydock.logger.error("Cannot clear #{self.class} at #{@dir.inspect}: #{e}")
    return false
  end
end
fetch(key, &blk) click to toggle source
# File lib/drydock/object_caches/filesystem_cache.rb, line 23
def fetch(key, &blk)
  filename = build_path(key)

  if File.exist?(filename)
    File.read(filename)
  else
    dirname = File.dirname(filename)
    FileUtils.mkdir_p(dirname)

    blk.call.tap do |contents|
      File.open(filename, 'w') do |file|
        file.write contents
      end
    end
  end
end
get(key, &blk) click to toggle source
# File lib/drydock/object_caches/filesystem_cache.rb, line 40
def get(key, &blk)
  filename = build_path(key)
  if File.exist?(filename)
    if blk.nil?
      File.read(filename)
    else
      File.open(filename) do |file|
        blk.call file
      end
    end
  else
    nil
  end
end
key?(key) click to toggle source
# File lib/drydock/object_caches/filesystem_cache.rb, line 55
def key?(key)
  File.exist?(build_path(key))
end
set(key, value = nil, &blk) click to toggle source
# File lib/drydock/object_caches/filesystem_cache.rb, line 59
def set(key, value = nil, &blk)
  filename = build_path(key)
  dirname = File.dirname(filename)
  FileUtils.mkdir_p(dirname)

  File.open(filename, 'w') do |file|
    if blk.nil?
      file.write value
    else
      blk.call file
    end
  end

  nil
end

Private Instance Methods

build_path(key) click to toggle source
# File lib/drydock/object_caches/filesystem_cache.rb, line 78
def build_path(key)
  digest   = Digest::SHA2.hexdigest(key)
  subdir1  = digest.slice(0, 2)
  subdir2  = digest.slice(2, 2)
  filename = digest.slice(4, digest.length - 4)
  File.join(dir, subdir1, subdir2, filename)
end