Class: Feature::RedisBackend

Inherits:
Object
  • Object
show all
Defined in:
lib/feature/redis_backend.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(redis_connection, opts = {}) ⇒ RedisBackend



6
7
8
9
10
11
12
13
14
15
16
# File 'lib/feature/redis_backend.rb', line 6

def initialize(redis_connection, opts = {})
  case redis_connection
  when Redis::Namespace
    @redis = redis_connection
  when Redis
    namespace = opts.fetch(:namespace, 'feature')
    @redis = Redis::Namespace.new(namespace, redis: redis_connection)
  else
    raise ArgumentError, "Invalid redis_connection: #{redis_connection.inspect}"
  end
end

Instance Attribute Details

#redisObject (readonly)

Returns the value of attribute redis.



4
5
6
# File 'lib/feature/redis_backend.rb', line 4

def redis
  @redis
end

Instance Method Details

#add_to_group(name, value) ⇒ Object



62
63
64
# File 'lib/feature/redis_backend.rb', line 62

def add_to_group(name, value)
  @redis.sadd(group_key(name), value)
end

#any_in_group?(name, values) ⇒ Boolean

Checks if any of the given values are part of the group



81
82
83
# File 'lib/feature/redis_backend.rb', line 81

def any_in_group?(name, values)
  Array(values).any? { |value| @redis.sismember(group_key(name), value) }
end

#delete_group(name) ⇒ Object

Deletes a group.



58
59
60
# File 'lib/feature/redis_backend.rb', line 58

def delete_group(name)
  @redis.del(group_key(name))
end

#disable(feature) ⇒ Object

Globally disable a feature



45
46
47
# File 'lib/feature/redis_backend.rb', line 45

def disable(feature)
  @redis.set(feature, 'disabled')
end

#enable(feature) ⇒ Object

Globally enable a feature



40
41
42
# File 'lib/feature/redis_backend.rb', line 40

def enable(feature)
  @redis.set(feature, 'enabled')
end

#enabled?(feature, opts) ⇒ Boolean

Check if a feature is enabled. A feature enabled globally takes precedence. If the feature has groups configured and is not enabled globally then group membership will be checked.



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/feature/redis_backend.rb', line 21

def enabled?(feature, opts)
  global_setting = check_global_value(feature, default: opts[:default])
  groups = opts.fetch(:groups, [])
  group_members = opts[:for] || opts[:for_any]

  # Return the global setting if its set to true, or if the there are no
  # groups configured for the feature or if no group members have been passed
  if global_setting || groups.empty? || group_members.nil?
    return global_setting
  end

  if opts[:for_any]
    groups.any? { |group| any_in_group?(group, group_members) }
  else
    groups.any? { |group| in_group?(group, group_members) }
  end
end

#get_group_members(name) ⇒ Object



70
71
72
# File 'lib/feature/redis_backend.rb', line 70

def get_group_members(name)
  @redis.smembers(group_key(name))
end

#group_key(name) ⇒ Object



85
86
87
# File 'lib/feature/redis_backend.rb', line 85

def group_key(name)
  "group:#{name}"
end

#in_group?(name, values) ⇒ Boolean

Checks if all of the given values are part of the group, accepts a string or array for value(s)



76
77
78
# File 'lib/feature/redis_backend.rb', line 76

def in_group?(name, values)
  Array(values).all? { |value| @redis.sismember(group_key(name), value) }
end

#remove_from_group(name, value) ⇒ Object



66
67
68
# File 'lib/feature/redis_backend.rb', line 66

def remove_from_group(name, value)
  @redis.srem(group_key(name), value)
end

#reset!Object



49
50
51
52
53
# File 'lib/feature/redis_backend.rb', line 49

def reset!
  # TODO use of KEYS command is recommended only for debugging. Refactor.
  keys = @redis.keys
  @redis.del(*keys) unless keys.empty?
end