Class: FeatureFlagger::Storage::Redis

Inherits:
Object
  • Object
show all
Defined in:
lib/feature_flagger/storage/redis.rb

Constant Summary collapse

DEFAULT_NAMESPACE =
:feature_flagger

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(redis) ⇒ Redis

Returns a new instance of Redis.



11
12
13
# File 'lib/feature_flagger/storage/redis.rb', line 11

def initialize(redis)
  @redis = redis
end

Class Method Details

.default_clientObject



15
16
17
18
19
# File 'lib/feature_flagger/storage/redis.rb', line 15

def self.default_client
  redis = ::Redis.new(url: ENV['REDIS_URL'])
  ns = ::Redis::Namespace.new(DEFAULT_NAMESPACE, redis: redis)
  new(ns)
end

Instance Method Details

#add(feature_key, resource_name, resource_ids) ⇒ Object



25
26
27
28
29
30
31
# File 'lib/feature_flagger/storage/redis.rb', line 25

def add(feature_key, resource_name, resource_ids)
  @redis.multi do |redis|
    Array(resource_ids).each do |resource_id|
      redis.sadd("#{resource_name}:#{resource_id}", feature_key)
    end
  end
end

#add_all(global_features_key, feature_key, resource_name) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
# File 'lib/feature_flagger/storage/redis.rb', line 62

def add_all(global_features_key, feature_key, resource_name)
  keys = search_keys("#{resource_name}:*") - ["#{resource_name}:#{global_features_key}"]

  add(feature_key, resource_name, global_features_key)

  @redis.multi do |redis|
    keys.map do |key|
      redis.srem(key.to_s, feature_key)
    end
  end
end

#all_feature_keys(global_features_key, resource_name, resource_id = nil) ⇒ Object



41
42
43
44
45
46
47
48
49
50
# File 'lib/feature_flagger/storage/redis.rb', line 41

def all_feature_keys(global_features_key, resource_name, resource_id = nil)
  if resource_id
    return @redis.sunion(
      "#{resource_name}:#{global_features_key}",
      "#{resource_name}:#{resource_id}"
    )
  end

  @redis.smembers("#{resource_name}:#{global_features_key}")
end

#all_values(feature_key, resource_name) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/feature_flagger/storage/redis.rb', line 74

def all_values(feature_key, resource_name)
  keys = search_keys("#{resource_name}:*")
  query = {}
  @redis.pipelined do |redis|
    keys.map do |key|
      query[key] = redis.sismember(key, feature_key)
    end
  end

  query.map do |key, in_redis|
    next unless in_redis.value == true

    key.gsub("#{resource_name}:", '')
  end.compact
end

#has_value?(feature_key, resource_name, resource_id) ⇒ Boolean

Returns:

  • (Boolean)


21
22
23
# File 'lib/feature_flagger/storage/redis.rb', line 21

def has_value?(feature_key, resource_name, resource_id)
  @redis.sismember("#{resource_name}:#{resource_id}", feature_key)
end

#remove(feature_key, resource_name, resource_ids) ⇒ Object



33
34
35
36
37
38
39
# File 'lib/feature_flagger/storage/redis.rb', line 33

def remove(feature_key, resource_name, resource_ids)
  @redis.multi do |redis|
    Array(resource_ids).each do |resource_id|
      redis.srem("#{resource_name}:#{resource_id}", feature_key)
    end
  end
end

#remove_all(feature_key, resource_name) ⇒ Object



52
53
54
55
56
57
58
59
60
# File 'lib/feature_flagger/storage/redis.rb', line 52

def remove_all(feature_key, resource_name)
  keys = search_keys("#{resource_name}:*")

  @redis.multi do |redis|
    keys.map do |key|
      redis.srem(key, feature_key)
    end
  end
end

#search_keys(pattern) ⇒ Object



90
91
92
# File 'lib/feature_flagger/storage/redis.rb', line 90

def search_keys(pattern)
  @redis.keys(pattern)
end