class Coverband::Adapters::RedisStore

RedisStore store a merged coverage file to redis

Constants

REDIS_STORAGE_FORMAT_VERSION

This key isn't related to the coverband version, but to the interal format used to store data to redis. It is changed only when breaking changes to our redis format are required.

Attributes

redis[R]
redis_namespace[R]

Public Class Methods

new(redis, opts = {}) click to toggle source
Calls superclass method Coverband::Adapters::Base::new
# File lib/coverband/adapters/redis_store.rb, line 18
def initialize(redis, opts = {})
  super()
  @redis = redis
  @ttl = opts[:ttl]
  @redis_namespace = opts[:redis_namespace]
  @format_version = REDIS_STORAGE_FORMAT_VERSION
  @keys = {}
  Coverband::TYPES.each do |type|
    @keys[type] = [@format_version, @redis_namespace, type].compact.join(".")
  end
end

Public Instance Methods

clear!() click to toggle source
# File lib/coverband/adapters/redis_store.rb, line 30
def clear!
  Coverband::TYPES.each do |type|
    @redis.del(type_base_key(type))
  end
  # temporarily clear the old namespace of coverband_3_2
  @redis.del(type_base_key(nil))
end
clear_file!(filename) click to toggle source
# File lib/coverband/adapters/redis_store.rb, line 38
def clear_file!(filename)
  Coverband::TYPES.each do |type|
    data = coverage(type)
    data.delete(filename)
    save_coverage(data, type)
  end
end
coverage(local_type = nil, opts = {}) click to toggle source
# File lib/coverband/adapters/redis_store.rb, line 77
def coverage(local_type = nil, opts = {})
  local_type ||= opts.key?(:override_type) ? opts[:override_type] : type
  data = redis.get 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
migrate!() click to toggle source

Current implementation moves from coverband3_1 to coverband_3_2 In the future this can be made more general and support a more specific version format.

# File lib/coverband/adapters/redis_store.rb, line 55
def migrate!
  reset_base_key
  @format_version = "coverband3_1"
  previous_data = coverage
  if previous_data.empty?
    puts "no previous data to migrate found"
    exit 0
  end
  relative_path_report = previous_data.each_with_object({}) { |(key, vals), fixed_report|
    fixed_report[Utils::RelativeFileConverter.convert(key)] = vals
  }
  clear!
  reset_base_key
  @format_version = REDIS_STORAGE_FORMAT_VERSION
  save_coverage(merge_reports(coverage, relative_path_report, skip_expansion: true))
end
raw_store() click to toggle source
# File lib/coverband/adapters/redis_store.rb, line 95
def raw_store
  @redis
end
save_report(report) click to toggle source

Note: This could lead to slight race on redis where multiple processes pull the old coverage and add to it then push the Coverband 2 had the same issue, and the tradeoff has always been acceptable

# File lib/coverband/adapters/redis_store.rb, line 89
def save_report(report)
  data = report.dup
  data = merge_reports(data, coverage(nil, skip_hash_check: true))
  save_coverage(data)
end
size() click to toggle source
# File lib/coverband/adapters/redis_store.rb, line 46
def size
  @redis.get(base_key) ? @redis.get(base_key).bytesize : "N/A"
end
type=(type) click to toggle source
Calls superclass method
# File lib/coverband/adapters/redis_store.rb, line 72
def type=(type)
  super
  reset_base_key
end

Private Instance Methods

base_key() click to toggle source
# File lib/coverband/adapters/redis_store.rb, line 107
def base_key
  @base_key ||= [@format_version, @redis_namespace, type].compact.join(".")
end
reset_base_key() click to toggle source
# File lib/coverband/adapters/redis_store.rb, line 103
def reset_base_key
  @base_key = nil
end
save_coverage(data, local_type = nil) click to toggle source
# File lib/coverband/adapters/redis_store.rb, line 115
def save_coverage(data, local_type = nil)
  local_type ||= type
  redis.set type_base_key(local_type), data.to_json
  redis.expire(type_base_key(local_type), @ttl) if @ttl
end
type_base_key(local_type) click to toggle source
# File lib/coverband/adapters/redis_store.rb, line 111
def type_base_key(local_type)
  @keys[local_type]
end