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