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

Returns a new instance of 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

Returns:

  • (Boolean)


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.

Returns:

  • (Boolean)


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)

Returns:

  • (Boolean)


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