class Kennel::FileCache

Public Class Methods

new(file, cache_version) click to toggle source
# File lib/kennel/file_cache.rb, line 8
def initialize(file, cache_version)
  @file = file
  @cache_version = cache_version
  @now = Time.now.to_i
  @expires = @now + (30 * 24 * 60 * 60) # 1 month
end

Public Instance Methods

fetch(key, key_version) { || ... } click to toggle source
# File lib/kennel/file_cache.rb, line 23
def fetch(key, key_version)
  old_value, old_version = @data[key]
  expected_version = [key_version, @cache_version]
  return old_value if old_version == expected_version

  new_value = yield
  @data[key] = [new_value, expected_version, @expires]
  new_value
end
open() { |self| ... } click to toggle source
# File lib/kennel/file_cache.rb, line 15
def open
  load_data
  expire_old_data
  yield self
ensure
  persist
end

Private Instance Methods

expire_old_data() click to toggle source

keep the cache small to make loading it fast (5MB ~= 100ms)

  • delete expired keys

  • delete what would be deleted anyway when updating

# File lib/kennel/file_cache.rb, line 53
def expire_old_data
  @data.reject! { |_, (_, (_, cv), expires)| expires < @now || cv != @cache_version }
end
load_data() click to toggle source
# File lib/kennel/file_cache.rb, line 35
def load_data
  @data =
    begin
      Marshal.load(File.read(@file)) # rubocop:disable Security/MarshalLoad
    rescue StandardError
      {}
    end
end
persist() click to toggle source
# File lib/kennel/file_cache.rb, line 44
def persist
  dir = File.dirname(@file)
  FileUtils.mkdir_p(dir) unless File.directory?(dir)
  File.write(@file, Marshal.dump(@data))
end