lib/rollout.rb in rollout-2.3.0 vs lib/rollout.rb in rollout-2.4.0
- old
+ new
@@ -1,30 +1,32 @@
require "rollout/version"
require "zlib"
require "set"
+require "json"
class Rollout
class Feature
- attr_accessor :groups, :users, :percentage
+ attr_accessor :groups, :users, :percentage, :data
attr_reader :name, :options
def initialize(name, string = nil, opts = {})
@options = opts
@name = name
if string
- raw_percentage,raw_users,raw_groups = string.split("|")
+ raw_percentage,raw_users,raw_groups,raw_data = string.split('|', 4)
@percentage = raw_percentage.to_f
- @users = (raw_users || "").split(",").map(&:to_s).to_set
- @groups = (raw_groups || "").split(",").map(&:to_sym).to_set
+ @users = users_from_string(raw_users)
+ @groups = groups_from_string(raw_groups)
+ @data = raw_data.nil? || raw_data.strip.empty? ? {} : JSON.parse(raw_data)
else
clear
end
end
def serialize
- "#{@percentage}|#{@users.to_a.join(",")}|#{@groups.to_a.join(",")}"
+ "#{@percentage}|#{@users.to_a.join(",")}|#{@groups.to_a.join(",")}|#{serialize_data}"
end
def add_user(user)
id = user_id(user)
@users << id unless @users.include?(id)
@@ -41,13 +43,14 @@
def remove_group(group)
@groups.delete(group.to_sym)
end
def clear
- @groups = Set.new
- @users = Set.new
+ @groups = groups_from_string("")
+ @users = users_from_string("")
@percentage = 0
+ @data = {}
end
def active?(rollout, user)
if user
id = user_id(user)
@@ -99,10 +102,34 @@
def user_in_active_group?(user, rollout)
@groups.any? do |g|
rollout.active_in_group?(g, user)
end
end
+
+ def serialize_data
+ return "" unless @data.is_a? Hash
+
+ @data.to_json
+ end
+
+ def users_from_string(raw_users)
+ users = (raw_users || "").split(",").map(&:to_s)
+ if @options[:use_sets]
+ users.to_set
+ else
+ users
+ end
+ end
+
+ def groups_from_string(raw_groups)
+ groups = (raw_groups || "").split(",").map(&:to_sym)
+ if @options[:use_sets]
+ groups.to_set
+ else
+ groups
+ end
+ end
end
def initialize(storage, opts = {})
@storage = storage
@options = opts
@@ -120,12 +147,12 @@
f.clear
end
end
def delete(feature)
- features = (@storage.get(features_key) || "").split(",").map(&:to_sym)
- features.delete(feature)
+ features = (@storage.get(features_key) || "").split(",")
+ features.delete(feature.to_s)
@storage.set(features_key, features.join(","))
@storage.del(key(feature))
end
def set(feature, desired_state)
@@ -210,9 +237,26 @@
end
def get(feature)
string = @storage.get(key(feature))
Feature.new(feature, string, @options)
+ end
+
+ def set_feature_data(feature, data)
+ with_feature(feature) do |f|
+ f.data.merge!(data) if data.is_a? Hash
+ end
+ end
+
+ def clear_feature_data(feature)
+ with_feature(feature) do |f|
+ f.data = {}
+ end
+ end
+
+ def multi_get(*features)
+ feature_keys = features.map{ |feature| key(feature) }
+ @storage.mget(*feature_keys).map.with_index { |string, index| Feature.new(features[index], string, @options) }
end
def features
(@storage.get(features_key) || "").split(",").map(&:to_sym)
end