lib/coverband/adapters/memcached_store.rb
# frozen_string_literal: true
module Coverband
module Adapters
class MemcachedStore < Base
STORAGE_FORMAT_VERSION = "coverband_3_2"
attr_reader :memcached_namespace
def initialize(memcached, opts = {})
super()
@memcached = memcached
@memcached_namespace = opts[:memcached_namespace]
@format_version = STORAGE_FORMAT_VERSION
@keys = {}
Coverband::TYPES.each do |type|
@keys[type] = [@format_version, @memcached_namespace, type].compact.join(".")
end
end
def clear!
Coverband::TYPES.each do |type|
@memcached.delete(type_base_key(type))
end
end
def clear_file!(filename)
Coverband::TYPES.each do |type|
data = coverage(type)
data.delete(filename)
save_coverage(data, type)
end
end
def size
@memcached.read(base_key) ? @memcached.read(base_key).bytesize : "N/A"
end
def migrate!
raise NotImplementedError, "MemcachedStore doesn't support migrations"
end
def type=(type)
super
reset_base_key
end
def coverage(local_type = nil, opts = {})
local_type ||= opts.key?(:override_type) ? opts[:override_type] : type
data = memcached.read(type_base_key(local_type))
data = data ? JSON.parse(data) : {}
data.delete_if { |file_path, file_data| file_hash(file_path) != file_data["file_hash"] } unless opts[:skip_hash_check]
data
end
def save_report(report)
data = report.dup
data = merge_reports(data, coverage(nil, skip_hash_check: true))
save_coverage(data)
end
def raw_store
raise NotImplementedError, "MemcachedStore doesn't support raw_store"
end
attr_reader :memcached
private
def reset_base_key
@base_key = nil
end
def base_key
@base_key ||= [@format_version, @memcached_namespace, type].compact.join(".")
end
def type_base_key(local_type)
@keys[local_type]
end
def save_coverage(data, local_type = nil)
local_type ||= type
key = type_base_key(local_type)
memcached.write(key, data.to_json)
end
end
end
end