lib/unleash/feature_toggle.rb in unleash-3.2.5 vs lib/unleash/feature_toggle.rb in unleash-4.0.0

- old
+ new

@@ -30,27 +30,34 @@ Unleash.toggle_metrics.increment(name, choice) unless Unleash.configuration.disable_metrics result end - def get_variant(context, fallback_variant = disabled_variant) + def get_variant(context, fallback_variant = Unleash::FeatureToggle.disabled_variant) raise ArgumentError, "Provided fallback_variant is not of type Unleash::Variant" if fallback_variant.class.name != 'Unleash::Variant' context = ensure_valid_context(context) - return disabled_variant unless self.enabled && am_enabled?(context, true) - return disabled_variant if sum_variant_defs_weights <= 0 + return Unleash::FeatureToggle.disabled_variant unless self.enabled && am_enabled?(context, true) + return Unleash::FeatureToggle.disabled_variant if sum_variant_defs_weights <= 0 - variant = variant_from_override_match(context) - variant = variant_from_weights(context) if variant.nil? + variant = variant_from_override_match(context) || variant_from_weights(context, resolve_stickiness) Unleash.toggle_metrics.increment_variant(self.name, variant.name) unless Unleash.configuration.disable_metrics variant end + def self.disabled_variant + Unleash::Variant.new(name: 'disabled', enabled: false) + end + private + def resolve_stickiness + self.variant_definitions&.map(&:stickiness)&.compact&.first || "default" + end + # only check if it is enabled, do not do metrics def am_enabled?(context, default_result) result = if self.enabled self.strategies.empty? || @@ -75,19 +82,16 @@ def strategy_constraint_matches?(strategy, context) strategy.constraints.empty? || strategy.constraints.all?{ |c| c.matches_context?(context) } end - def disabled_variant - Unleash::Variant.new(name: 'disabled', enabled: false) - end - def sum_variant_defs_weights self.variant_definitions.map(&:weight).reduce(0, :+) end - def variant_salt(context) + def variant_salt(context, stickiness = "default") + return context.get_by_name(stickiness) unless stickiness == "default" return context.user_id unless context.user_id.to_s.empty? return context.session_id unless context.session_id.to_s.empty? return context.remote_address unless context.remote_address.to_s.empty? SecureRandom.random_number @@ -98,21 +102,21 @@ return nil if variant.nil? Unleash::Variant.new(name: variant.name, enabled: true, payload: variant.payload) end - def variant_from_weights(context) - variant_weight = Unleash::Strategy::Util.get_normalized_number(variant_salt(context), self.name, sum_variant_defs_weights) + def variant_from_weights(context, stickiness) + variant_weight = Unleash::Strategy::Util.get_normalized_number(variant_salt(context, stickiness), self.name, sum_variant_defs_weights) prev_weights = 0 variant_definition = self.variant_definitions .find do |v| res = (prev_weights + v.weight >= variant_weight) prev_weights += v.weight res end - return disabled_variant if variant_definition.nil? + return self.disabled_variant if variant_definition.nil? Unleash::Variant.new(name: variant_definition.name, enabled: true, payload: variant_definition.payload) end def ensure_valid_context(context) @@ -148,9 +152,10 @@ .map do |v| VariantDefinition.new( v.fetch('name', ''), v.fetch('weight', 0), v.fetch('payload', nil), + v.fetch('stickiness', nil), v.fetch('overrides', []) ) end || [] end end