Module: WebTestingSegmentUtil
- Defined in:
- lib/wingify/packages/segmentation_evaluator/utils/web_testing_segment_util.rb
Class Method Summary collapse
-
.evaluate_web_testing_campaign_variation(campaign_variation_operand, assigned_variations_by_campaign_id) ⇒ Object
Evaluates campaignVariation operand encoding: - "!C" — user is not in campaign C (no entry in map) - "C_!V" — user is in campaign C and assigned variation is not V - "C_V" — user is in campaign C with variation V - "C" (digits only) — user is in campaign C (any variation).
-
.normalize_web_testing_campaigns_map(raw_assignments) ⇒ Hash
Normalizes Web Testing campaign map keys and variation values to strings.
-
.parse_web_testing_campaigns_from_context(context) ⇒ Hash?
Parses
context.platform_variables[:webTestingCampaigns](JSON string or plain object).
Class Method Details
.evaluate_web_testing_campaign_variation(campaign_variation_operand, assigned_variations_by_campaign_id) ⇒ Object
Evaluates campaignVariation operand encoding:
- "!C" — user is not in campaign C (no entry in map)
- "C_!V" — user is in campaign C and assigned variation is not V
- "C_V" — user is in campaign C with variation V
- "C" (digits only) — user is in campaign C (any variation)
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
# File 'lib/wingify/packages/segmentation_evaluator/utils/web_testing_segment_util.rb', line 108 def evaluate_web_testing_campaign_variation(campaign_variation_operand, assigned_variations_by_campaign_id) assignments = assigned_variations_by_campaign_id || {} # match type !C if match = /^!(\d+)$/.match(campaign_variation_operand) campaign_id = match[1] return { result: !assignments.key?(campaign_id), invalid_format: false } end # match type C_!V if match = /^(\d+)_!(\d+)$/.match(campaign_variation_operand) campaign_id = match[1] variation_id = match[2] if !assignments.key?(campaign_id) return { result: false, invalid_format: false } end return { result: assignments[campaign_id] != variation_id, invalid_format: false } end # match type C_V if match = /^(\d+)_(\d+)$/.match(campaign_variation_operand) campaign_id = match[1] variation_id = match[2] if !assignments.key?(campaign_id) return { result: false, invalid_format: false } end return { result: assignments[campaign_id] == variation_id, invalid_format: false } end # match type C if match = /^(\d+)$/.match(campaign_variation_operand) campaign_id = match[1] return { result: assignments.key?(campaign_id), invalid_format: false } end { result: false, invalid_format: true } end |
.normalize_web_testing_campaigns_map(raw_assignments) ⇒ Hash
Normalizes Web Testing campaign map keys and variation values to strings.
26 27 28 29 30 31 32 33 34 |
# File 'lib/wingify/packages/segmentation_evaluator/utils/web_testing_segment_util.rb', line 26 def normalize_web_testing_campaigns_map(raw_assignments) campaign_id_to_variation_id = {} raw_assignments.each do |campaign_id, assigned_variation_id| unless assigned_variation_id.nil? || campaign_id.to_s.empty? campaign_id_to_variation_id[campaign_id.to_s] = assigned_variation_id.to_s end end campaign_id_to_variation_id end |
.parse_web_testing_campaigns_from_context(context) ⇒ Hash?
Parses context.platform_variables[:webTestingCampaigns] (JSON string or plain object).
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/wingify/packages/segmentation_evaluator/utils/web_testing_segment_util.rb', line 39 def parse_web_testing_campaigns_from_context(context) platform_variables = context.get_platform_variables || {} # support both string and symbol keys web_testing_campaigns_input = platform_variables[:webTestingCampaigns] || platform_variables['webTestingCampaigns'] if web_testing_campaigns_input.nil? return nil end if web_testing_campaigns_input.is_a?(Hash) return normalize_web_testing_campaigns_map(web_testing_campaigns_input) end if web_testing_campaigns_input.is_a?(String) trimmed_json = web_testing_campaigns_input.strip if trimmed_json.empty? return nil end begin # Check for duplicate keys using regex all_campaign_id_tokens = trimmed_json.scan(/"([^"\\]*)"\s*:/).flatten if all_campaign_id_tokens.any? campaign_ids = all_campaign_id_tokens has_duplicate_campaign_id = campaign_ids.length != campaign_ids.uniq.length if has_duplicate_campaign_id LoggerService.log( LogLevelEnum::ERROR, 'INVALID_WEB_TESTING_CAMPAIGNS_DUPLICATE_KEY', { an: ApiEnum::GET_FLAG, uuid: context.get_uuid, sId: context.get_session_id } ) end end parsed_assignments = JSON.parse(trimmed_json) if parsed_assignments.is_a?(Hash) return normalize_web_testing_campaigns_map(parsed_assignments) end LoggerService.log( LogLevelEnum::ERROR, 'INVALID_WEB_TESTING_CAMPAIGNS_JSON', { an: ApiEnum::GET_FLAG, uuid: context.get_uuid, sId: context.get_session_id } ) rescue JSON::ParserError LoggerService.log( LogLevelEnum::ERROR, 'INVALID_WEB_TESTING_CAMPAIGNS_JSON', { an: ApiEnum::GET_FLAG, uuid: context.get_uuid, sId: context.get_session_id } ) end return nil end # For array, numeric, boolean etc. kind = web_testing_campaigns_input.is_a?(Array) ? 'array' : DataTypeUtil.get_type(web_testing_campaigns_input).downcase LoggerService.log( LogLevelEnum::ERROR, 'INVALID_WEB_TESTING_CAMPAIGNS_TYPE', { kind: kind, an: ApiEnum::GET_FLAG, uuid: context.get_uuid, sId: context.get_session_id } ) nil end |