Class: Feature::RedisBackend
- Inherits:
-
Object
- Object
- Feature::RedisBackend
- Defined in:
- lib/feature/redis_backend.rb
Instance Attribute Summary collapse
-
#redis ⇒ Object
readonly
Returns the value of attribute redis.
Instance Method Summary collapse
- #add_to_group(name, value) ⇒ Object
-
#any_in_group?(name, values) ⇒ Boolean
Checks if any of the given values are part of the group.
-
#delete_group(name) ⇒ Object
Deletes a group.
-
#disable(feature) ⇒ Object
Globally disable a feature.
-
#enable(feature) ⇒ Object
Globally enable a feature.
-
#enabled?(feature, opts) ⇒ Boolean
Check if a feature is enabled.
- #get_group_members(name) ⇒ Object
- #group_key(name) ⇒ Object
-
#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).
-
#initialize(redis_connection, opts = {}) ⇒ RedisBackend
constructor
A new instance of RedisBackend.
- #remove_from_group(name, value) ⇒ Object
- #reset! ⇒ Object
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
#redis ⇒ Object (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 |