class Featurer::RedisAdapter

Public Instance Methods

add(feature, value) click to toggle source
# File lib/featurer/adapters/redis.rb, line 12
def add(feature, value)
  save_set(feature, value)
end
delete(feature) click to toggle source
# File lib/featurer/adapters/redis.rb, line 16
def delete(feature)
  delete_key(feature)
end
enabled_features(value = true) click to toggle source
# File lib/featurer/adapters/redis.rb, line 27
def enabled_features(value = true)
  all_features.select { |feature| on?(feature, value) }
rescue => e
  @config[:logger].warn e
  []
end
feature_list() click to toggle source
# File lib/featurer/adapters/redis.rb, line 45
def feature_list
  full_feature_names.map do |full_feature_name|
    {
      name: short_feature_name(full_feature_name),
      matching_values: @redis.smembers(full_feature_name)
    }
  end
end
off(feature, value) click to toggle source
# File lib/featurer/adapters/redis.rb, line 34
def off(feature, value)
  remove_from_set(feature, value)
end
on?(feature, value = true) click to toggle source
# File lib/featurer/adapters/redis.rb, line 20
def on?(feature, value = true)
  fetch_from_set(feature, value)
rescue => e
  @config[:logger].warn e
  false
end
prepare() click to toggle source
# File lib/featurer/adapters/redis.rb, line 6
def prepare
  @redis = @config[:client] || ::Redis.new(host: @config[:host],
                                           port: @config[:port],
                                           db: @config[:db])
end
register(feature, value = true) click to toggle source
# File lib/featurer/adapters/redis.rb, line 38
def register(feature, value = true)
  return if feature.nil? || feature.empty?

  delete(feature)
  save_set(feature, value)
end

Private Instance Methods

all_features() click to toggle source
# File lib/featurer/adapters/redis.rb, line 88
def all_features
  full_feature_names.map do |key|
    short_feature_name(key)
  end
end
delete_key(name) click to toggle source
# File lib/featurer/adapters/redis.rb, line 60
def delete_key(name)
  @redis.del key(name)
end
fetch_from_set(name, value) click to toggle source
# File lib/featurer/adapters/redis.rb, line 68
def fetch_from_set(name, value)
  matching_values = @redis.smembers(key(name))

  matching_values.each do |matching_value|
    return true if matching_value == 'true' # Globally enabled feature

    if value.is_a?(String) && matching_value =~ /\(\?-mix:.+\)/ # Regexp matching
      return true if Regexp.new(matching_value).match(value)
    elsif matching_value == value.to_s # By exact value
      return true
    end
  end

  false
end
full_feature_names() click to toggle source
# File lib/featurer/adapters/redis.rb, line 94
def full_feature_names
  @redis.keys("#{@config[:prefix]}:feature:*")
end
key(name) click to toggle source
# File lib/featurer/adapters/redis.rb, line 56
def key(name)
  "#{@config[:prefix]}:feature:#{name}"
end
remove_from_set(name, id) click to toggle source
# File lib/featurer/adapters/redis.rb, line 84
def remove_from_set(name, id)
  @redis.srem(key(name), id)
end
save_set(name, value) click to toggle source
# File lib/featurer/adapters/redis.rb, line 64
def save_set(name, value)
  @redis.sadd key(name), value
end
short_feature_name(full_feature_name) click to toggle source
# File lib/featurer/adapters/redis.rb, line 98
def short_feature_name(full_feature_name)
  full_feature_name.split("#{@config[:prefix]}:feature:").last.to_sym
end