lib/rollout.rb in rollout-1.1.0 vs lib/rollout.rb in rollout-1.2.0
- old
+ new
@@ -2,10 +2,18 @@
def initialize(redis)
@redis = redis
@groups = {"all" => lambda { |user| true }}
end
+ def activate_globally(feature)
+ @redis.sadd(global_key, feature)
+ end
+
+ def deactivate_globally(feature)
+ @redis.srem(global_key, feature)
+ end
+
def activate_group(feature, group)
@redis.sadd(group_key(feature), group)
end
def deactivate_group(feature, group)
@@ -14,10 +22,11 @@
def deactivate_all(feature)
@redis.del(group_key(feature))
@redis.del(user_key(feature))
@redis.del(percentage_key(feature))
+ deactivate_globally(feature)
end
def activate_user(feature, user)
@redis.sadd(user_key(feature), user.id)
end
@@ -28,30 +37,42 @@
def define_group(group, &block)
@groups[group.to_s] = block
end
- def active?(feature, user)
- user_in_active_group?(feature, user) ||
- user_active?(feature, user) ||
- user_within_active_percentage?(feature, user)
+ def active?(feature, user = nil)
+ if user
+ active_globally?(feature) ||
+ user_in_active_group?(feature, user) ||
+ user_active?(feature, user) ||
+ user_within_active_percentage?(feature, user)
+ else
+ active_globally?(feature)
+ end
end
def activate_percentage(feature, percentage)
@redis.set(percentage_key(feature), percentage)
end
def deactivate_percentage(feature)
@redis.del(percentage_key(feature))
end
- def info(feature)
- {
- :percentage => (active_percentage(feature) || 0).to_i,
- :groups => active_groups(feature).map { |g| g.to_sym },
- :users => active_user_ids(feature)
- }
+ def info(feature = nil)
+ if feature
+ {
+ :percentage => (active_percentage(feature) || 0).to_i,
+ :groups => active_groups(feature).map { |g| g.to_sym },
+ :users => active_user_ids(feature),
+ :global => active_global_features
+ }
+ else
+ {
+ :global => active_global_features
+ }
+ end
end
private
def key(name)
"feature:#{name}"
@@ -67,19 +88,31 @@
def percentage_key(name)
"#{key(name)}:percentage"
end
+ def global_key
+ "feature:__global__"
+ end
+
def active_groups(feature)
@redis.smembers(group_key(feature)) || []
end
def active_user_ids(feature)
@redis.smembers(user_key(feature)).map { |id| id.to_i }
end
+ def active_global_features
+ (@redis.smembers(global_key) || []).map(&:to_sym)
+ end
+
def active_percentage(feature)
@redis.get(percentage_key(feature))
+ end
+
+ def active_globally?(feature)
+ @redis.sismember(global_key, feature)
end
def user_in_active_group?(feature, user)
active_groups(feature).any? do |group|
@groups.key?(group) && @groups[group].call(user)