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