From c971e10027f5882804a4a9163074e8f7d34944fe Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Wed, 22 Dec 2021 14:33:53 +0500 Subject: [PATCH 1/5] moved validated forced decision to decision service --- lib/optimizely.rb | 2 +- lib/optimizely/decision_service.rb | 26 +++++++++++++++++++++-- lib/optimizely/optimizely_user_context.rb | 23 +------------------- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/lib/optimizely.rb b/lib/optimizely.rb index de1315ce..a769f96c 100644 --- a/lib/optimizely.rb +++ b/lib/optimizely.rb @@ -199,7 +199,7 @@ def decide(user_context, key, decide_options = []) experiment = nil decision_source = Optimizely::DecisionService::DECISION_SOURCES['ROLLOUT'] context = Optimizely::OptimizelyUserContext::OptimizelyDecisionContext.new(key, nil) - variation, reasons_received = user_context.find_validated_forced_decision(context) + variation, reasons_received = @decision_service.validated_forced_decision(context, user_context) reasons.push(*reasons_received) if variation diff --git a/lib/optimizely/decision_service.rb b/lib/optimizely/decision_service.rb index 77fe0f0c..14a95f20 100644 --- a/lib/optimizely/decision_service.rb +++ b/lib/optimizely/decision_service.rb @@ -265,7 +265,7 @@ def get_variation_from_experiment_rule(project_config, flag_key, rule, user, opt reasons = [] context = Optimizely::OptimizelyUserContext::OptimizelyDecisionContext.new(flag_key, rule['key']) - variation, forced_reasons = user.find_validated_forced_decision(context) + variation, forced_reasons = validated_forced_decision(context, user) reasons.push(*forced_reasons) return [variation['id'], reasons] if variation @@ -290,7 +290,7 @@ def get_variation_from_delivery_rule(project_config, flag_key, rules, rule_index skip_to_everyone_else = false rule = rules[rule_index] context = Optimizely::OptimizelyUserContext::OptimizelyDecisionContext.new(flag_key, rule['key']) - variation, forced_reasons = user.find_validated_forced_decision(context) + variation, forced_reasons = validated_forced_decision(context, user) reasons.push(*forced_reasons) return [variation, skip_to_everyone_else, reasons] if variation @@ -417,6 +417,28 @@ def get_forced_variation(project_config, experiment_key, user_id) [variation, decide_reasons] end + def validated_forced_decision(context, user_context) + decision = user_context.find_forced_decision(context) + flag_key = context[:flag_key] + rule_key = context[:rule_key] + variation_key = decision ? decision[:variation_key] : decision + reasons = [] + target = rule_key ? "flag (#{flag_key}), rule (#{rule_key})" : "flag (#{flag_key})" + if variation_key + variation = user_context.optimizely_client.get_flag_variation(flag_key, variation_key, 'key') + if variation + reason = "Variation (#{variation_key}) is mapped to #{target} and user (#{user_context.user_id}) in the forced decision map." + reasons.push(reason) + return variation, reasons + else + reason = "Invalid variation is mapped to #{target} and user (#{user_context.user_id}) in the forced decision map." + reasons.push(reason) + end + end + + [nil, reasons] + end + private def get_whitelisted_variation_id(project_config, experiment_id, user_id) diff --git a/lib/optimizely/optimizely_user_context.rb b/lib/optimizely/optimizely_user_context.rb index 2d6f9500..8acfdeea 100644 --- a/lib/optimizely/optimizely_user_context.rb +++ b/lib/optimizely/optimizely_user_context.rb @@ -26,6 +26,7 @@ class OptimizelyUserContext attr_reader :forced_decisions attr_reader :OptimizelyDecisionContext attr_reader :OptimizelyForcedDecision + attr_reader :optimizely_client OptimizelyDecisionContext = Struct.new(:flag_key, :rule_key) OptimizelyForcedDecision = Struct.new(:variation_key) @@ -156,28 +157,6 @@ def remove_all_forced_decisions true end - def find_validated_forced_decision(context) - decision = find_forced_decision(context) - flag_key = context[:flag_key] - rule_key = context[:rule_key] - variation_key = decision ? decision[:variation_key] : decision - reasons = [] - target = rule_key ? "flag (#{flag_key}), rule (#{rule_key})" : "flag (#{flag_key})" - if variation_key - variation = @optimizely_client.get_flag_variation(flag_key, variation_key, 'key') - if variation - reason = "Variation (#{variation_key}) is mapped to #{target} and user (#{@user_id}) in the forced decision map." - reasons.push(reason) - return variation, reasons - else - reason = "Invalid variation is mapped to #{target} and user (#{@user_id}) in the forced decision map." - reasons.push(reason) - end - end - - [nil, reasons] - end - # Track an event # # @param event_key - Event key representing the event which needs to be recorded. From 6cad8da51544fdae8732043b5e5240e331ce2515 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Tue, 4 Jan 2022 18:42:52 +0500 Subject: [PATCH 2/5] headers updated --- lib/optimizely.rb | 2 +- lib/optimizely/decision_service.rb | 2 +- lib/optimizely/optimizely_user_context.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/optimizely.rb b/lib/optimizely.rb index a769f96c..9b998b99 100644 --- a/lib/optimizely.rb +++ b/lib/optimizely.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true # -# Copyright 2016-2021, Optimizely and contributors +# Copyright 2016-2022, Optimizely and contributors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/lib/optimizely/decision_service.rb b/lib/optimizely/decision_service.rb index 14a95f20..fc6fe0f1 100644 --- a/lib/optimizely/decision_service.rb +++ b/lib/optimizely/decision_service.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true # -# Copyright 2017-2021, Optimizely and contributors +# Copyright 2017-2022, Optimizely and contributors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/lib/optimizely/optimizely_user_context.rb b/lib/optimizely/optimizely_user_context.rb index 8acfdeea..04d663b6 100644 --- a/lib/optimizely/optimizely_user_context.rb +++ b/lib/optimizely/optimizely_user_context.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true # -# Copyright 2020, Optimizely and contributors +# Copyright 2020-2022, Optimizely and contributors # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. From 9b85bc297ba987f20c074bd5d20d9dc2a64c2e26 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Thu, 6 Jan 2022 19:30:18 +0500 Subject: [PATCH 3/5] find_forced_decision updated to get_forced_decision --- lib/optimizely/decision_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/optimizely/decision_service.rb b/lib/optimizely/decision_service.rb index fc6fe0f1..d1cc8c35 100644 --- a/lib/optimizely/decision_service.rb +++ b/lib/optimizely/decision_service.rb @@ -418,7 +418,7 @@ def get_forced_variation(project_config, experiment_key, user_id) end def validated_forced_decision(context, user_context) - decision = user_context.find_forced_decision(context) + decision = user_context.get_forced_decision(context) flag_key = context[:flag_key] rule_key = context[:rule_key] variation_key = decision ? decision[:variation_key] : decision From 4e43f2abf156e91c81dc730a34154fa0fa134360 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Fri, 7 Jan 2022 01:03:04 +0500 Subject: [PATCH 4/5] added project config --- lib/optimizely.rb | 2 +- lib/optimizely/decision_service.rb | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/optimizely.rb b/lib/optimizely.rb index 9b998b99..e2e23320 100644 --- a/lib/optimizely.rb +++ b/lib/optimizely.rb @@ -199,7 +199,7 @@ def decide(user_context, key, decide_options = []) experiment = nil decision_source = Optimizely::DecisionService::DECISION_SOURCES['ROLLOUT'] context = Optimizely::OptimizelyUserContext::OptimizelyDecisionContext.new(key, nil) - variation, reasons_received = @decision_service.validated_forced_decision(context, user_context) + variation, reasons_received = @decision_service.validated_forced_decision(config, context, user_context) reasons.push(*reasons_received) if variation diff --git a/lib/optimizely/decision_service.rb b/lib/optimizely/decision_service.rb index d1cc8c35..4e98c1e0 100644 --- a/lib/optimizely/decision_service.rb +++ b/lib/optimizely/decision_service.rb @@ -265,7 +265,7 @@ def get_variation_from_experiment_rule(project_config, flag_key, rule, user, opt reasons = [] context = Optimizely::OptimizelyUserContext::OptimizelyDecisionContext.new(flag_key, rule['key']) - variation, forced_reasons = validated_forced_decision(context, user) + variation, forced_reasons = validated_forced_decision(project_config, context, user) reasons.push(*forced_reasons) return [variation['id'], reasons] if variation @@ -290,7 +290,7 @@ def get_variation_from_delivery_rule(project_config, flag_key, rules, rule_index skip_to_everyone_else = false rule = rules[rule_index] context = Optimizely::OptimizelyUserContext::OptimizelyDecisionContext.new(flag_key, rule['key']) - variation, forced_reasons = validated_forced_decision(context, user) + variation, forced_reasons = validated_forced_decision(project_config, context, user) reasons.push(*forced_reasons) return [variation, skip_to_everyone_else, reasons] if variation @@ -417,7 +417,7 @@ def get_forced_variation(project_config, experiment_key, user_id) [variation, decide_reasons] end - def validated_forced_decision(context, user_context) + def validated_forced_decision(project_config, context, user_context) decision = user_context.get_forced_decision(context) flag_key = context[:flag_key] rule_key = context[:rule_key] @@ -425,7 +425,7 @@ def validated_forced_decision(context, user_context) reasons = [] target = rule_key ? "flag (#{flag_key}), rule (#{rule_key})" : "flag (#{flag_key})" if variation_key - variation = user_context.optimizely_client.get_flag_variation(flag_key, variation_key, 'key') + variation = project_config.get_flag_variation(flag_key, variation_key, 'key') if variation reason = "Variation (#{variation_key}) is mapped to #{target} and user (#{user_context.user_id}) in the forced decision map." reasons.push(reason) From 27bf9293b6123c5d3c57c2811d4f54abeeabfa30 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Fri, 7 Jan 2022 01:11:23 +0500 Subject: [PATCH 5/5] function name corrected --- lib/optimizely/decision_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/optimizely/decision_service.rb b/lib/optimizely/decision_service.rb index 4e98c1e0..9c04923e 100644 --- a/lib/optimizely/decision_service.rb +++ b/lib/optimizely/decision_service.rb @@ -425,7 +425,7 @@ def validated_forced_decision(project_config, context, user_context) reasons = [] target = rule_key ? "flag (#{flag_key}), rule (#{rule_key})" : "flag (#{flag_key})" if variation_key - variation = project_config.get_flag_variation(flag_key, variation_key, 'key') + variation = project_config.get_variation_from_flag(flag_key, variation_key, 'key') if variation reason = "Variation (#{variation_key}) is mapped to #{target} and user (#{user_context.user_id}) in the forced decision map." reasons.push(reason)