module VWO::Utils::Campaign

Public Instance Methods

get_campaign_goal(campaign, goal_identifier) click to toggle source

Returns goal from given campaign_key and gaol_identifier. @param :campaign Campaign object @param :goal_identifier Goal identifier

@return Goal corresponding to Goal_identifier in respective campaign

# File lib/vwo/utils/campaign.rb, line 86
def get_campaign_goal(campaign, goal_identifier)
  return unless campaign && goal_identifier

  campaign['goals'].find do |goal|
    goal['identifier'] == goal_identifier
  end
end
get_control_variation(campaign) click to toggle source

Returns control variation from a given campaign @param campaign Running campaign @return variation Control variation from the campaign, ie having id = 1

# File lib/vwo/utils/campaign.rb, line 106
def get_control_variation(campaign)
  campaign['variations'].find do |variation|
    variation['id'] == 1
  end
end
get_segments(campaign) click to toggle source

Returns segments from the campaign @param campaign Running campaign @return A dsl of segments

# File lib/vwo/utils/campaign.rb, line 98
def get_segments(campaign)
  campaign['segments']
end
get_variable(variables, variable_key) click to toggle source

Returns variable from given variables list. @params variables List of variables, whether in campaigns or inside variation @param variable_key Variable identifier @return Variable corresponding to variable_key in given variable list

# File lib/vwo/utils/campaign.rb, line 117
def get_variable(variables, variable_key)
  variables.find do |variable|
    variable['key'] == variable_key
  end
end
set_campaign_allocation(campaigns) click to toggle source

Sets campaign allocation range in the provided campaigns list

@param [Array]: Array of Campaigns

# File lib/vwo/utils/campaign.rb, line 63
def set_campaign_allocation(campaigns)
  current_allocation = 0
  campaigns.each do |campaign|
    step_factor = get_variation_bucketing_range(campaign['weight'])
    if step_factor > 0
      start_range = current_allocation + 1
      end_range = current_allocation + step_factor
      campaign['min_range'] = start_range
      campaign['max_range'] = end_range
      current_allocation += step_factor
    else
      campaign['min_range'] = -1
      campaign['max_range'] = -1
    end
  end
end
set_variation_allocation(campaign) click to toggle source

Sets variation allocation range in the provided campaign

@param [Hash]: Campaign object

# File lib/vwo/utils/campaign.rb, line 30
def set_variation_allocation(campaign)
  current_allocation = 0
  campaign['variations'].each do |variation|
    step_factor = get_variation_bucketing_range(variation['weight'])
    if step_factor > 0
      start_range = current_allocation + 1
      end_range = current_allocation + step_factor
      variation['start_variation_allocation'] = start_range
      variation['end_variation_allocation'] = end_range
      current_allocation += step_factor
    else
      variation['start_variation_allocation'] = -1
      variation['end_variation_allocation'] = -1
    end

    VWO::Logger.get_instance.log(
      LogLevelEnum::INFO,
      format(
        LogMessageEnum::InfoMessages::VARIATION_RANGE_ALLOCATION,
        file: FileNameEnum::CampaignUtil,
        campaign_key: campaign['key'],
        variation_name: variation['name'],
        variation_weight: variation['weight'],
        start: variation['start_variation_allocation'],
        end: variation['end_variation_allocation']
      )
    )
  end
end

Private Instance Methods

get_campaign(settings_file, campaign_key) click to toggle source

Finds and Returns campaign from given campaign_key.

Hash

:settings_file Settings file for the project

String

:campaign_key Campaign identifier key

@return Campaign object

# File lib/vwo/utils/campaign.rb, line 160
def get_campaign(settings_file, campaign_key)
  settings_file['campaigns'].find do |campaign|
    campaign['key'] == campaign_key
  end
end
get_campaign_for_campaign_key_and_goal(campaign_key, settings_file, goal_identifier, goal_type_to_track) click to toggle source
# File lib/vwo/utils/campaign.rb, line 244
def get_campaign_for_campaign_key_and_goal(campaign_key, settings_file, goal_identifier, goal_type_to_track)
  campaign = get_running_campaign(campaign_key, settings_file)
  if campaign
    goal = get_campaign_goal(campaign, goal_identifier)
    if validate_goal(goal, goal_type_to_track)
      return campaign
    end
  end
  nil
end
get_campaign_variation(settings_file, campaign_key, variation_name) click to toggle source

Returns variation from given campaign_key and variation_name.

@param :settings_file Settings file @param :campaign_key Campaign identifier key @param :variation_name Variation identifier

@return Variation corresponding to variation_name in respective campaign

# File lib/vwo/utils/campaign.rb, line 144
def get_campaign_variation(settings_file, campaign_key, variation_name)
  return unless settings_file && campaign_key && variation_name

  campaign = get_campaign(settings_file, campaign_key)
  return unless campaign

  campaign['variations'].find do |variation|
    variation['name'] == variation_name
  end
end
get_campaigns(settings_file, campaign_key, goal_identifier, goal_type_to_track = 'ALL') click to toggle source

fetch campaigns from settings

string|array|nil

:campaign_key

Hash

:settings_file

string

:goal_identifier

string

:goal_type_to_track

@return

# File lib/vwo/utils/campaign.rb, line 173
def get_campaigns(settings_file, campaign_key, goal_identifier, goal_type_to_track = 'ALL')
  campaigns = []
  if campaign_key.nil?
    campaigns = get_campaigns_for_goal(settings_file, goal_identifier, goal_type_to_track)
  elsif campaign_key.is_a?(Array)
    campaigns = get_campaigns_from_campaign_keys(campaign_key, settings_file, goal_identifier, goal_type_to_track)
  elsif campaign_key.is_a?(String)
    campaign = get_campaign_for_campaign_key_and_goal(campaign_key, settings_file, goal_identifier, goal_type_to_track)
    if campaign
      campaigns = [campaign]
    end
  end
  if campaigns.length() == 0
    VWO::Logger.get_instance.log(
      LogLevelEnum::ERROR,
      format(
        LogMessageEnum::ErrorMessages::NO_CAMPAIGN_FOUND,
        file: FileNameEnum::CampaignUtil,
        goal_identifier: goal_identifier
      )
    )
  end
  return campaigns
end
get_campaigns_for_goal(settings_file, goal_identifier, goal_type_to_track = 'ALL') click to toggle source

fetch all running campaigns (having goal identifier goal_type_to_track and goal type CUSTOM|REVENUE|ALL) from settings

[Hash]             :settings_file
[string]           :goal_identifier
[string]           :goal_type_to_track
@return[Hash]
# File lib/vwo/utils/campaign.rb, line 204
def get_campaigns_for_goal(settings_file, goal_identifier, goal_type_to_track = 'ALL')
  campaigns = []
  if settings_file
    settings_file['campaigns'].each do |campaign|
      if campaign.key?(:status) && campaign[:status] != 'RUNNING'
        next
      end
      goal = get_campaign_goal(campaign, goal_identifier)
      if validate_goal(goal, goal_type_to_track)
        campaigns.push(campaign)
      end
    end
  end
  campaigns
end
get_campaigns_from_campaign_keys(campaign_keys, settings_file, goal_identifier, goal_type_to_track = 'ALL') click to toggle source
# File lib/vwo/utils/campaign.rb, line 232
def get_campaigns_from_campaign_keys(campaign_keys, settings_file, goal_identifier, goal_type_to_track = 'ALL')
  campaigns = []
  campaign_keys.each do |campaign_key|

    campaign = get_campaign_for_campaign_key_and_goal(campaign_key, settings_file, goal_identifier, goal_type_to_track)
    if campaign
      campaigns.push(campaign)
    end
  end
  campaigns
end
get_group_campaigns(settings_file, group_id) click to toggle source

Returns campaigns which are part of given group using group_id.

@param[Hash]       :settings_file          Settings file for the project
@param[Integer]    :group_id               id of group whose campaigns are to be return
@return[Array]
# File lib/vwo/utils/campaign.rb, line 289
def get_group_campaigns(settings_file, group_id)
  group_campaign_ids = []
  group_campaigns = []
  groups = settings_file["groups"]

  if groups && groups.has_key?(group_id.to_s)
    group_campaign_ids = groups[group_id.to_s]["campaigns"]
  end

  if group_campaign_ids
    group_campaign_ids.each do |campaign_id|
      settings_file["campaigns"].each do |campaign|
        if campaign["id"] == campaign_id && campaign["status"] == STATUS_RUNNING
          group_campaigns.append(campaign)
        end
      end
    end
  end
  group_campaigns
end
get_running_campaign(campaign_key, settings_file) click to toggle source
# File lib/vwo/utils/campaign.rb, line 255
def get_running_campaign(campaign_key, settings_file)
  campaign = get_campaign(settings_file, campaign_key)
  if campaign.nil? || (campaign['status'] != 'RUNNING')
    @logger.log(
      LogLevelEnum::ERROR,
      format(
        LogMessageEnum::ErrorMessages::CAMPAIGN_NOT_RUNNING,
        file: FILE,
        campaign_key: campaign_key,
        api_name: ApiMethods::TRACK
      )
    )
    nil
  end
  return campaign
end
get_variation_bucketing_range(weight) click to toggle source

Returns the bucket size of variation. @param (Number): weight of variation @return (Integer): Bucket start range of Variation

# File lib/vwo/utils/campaign.rb, line 129
def get_variation_bucketing_range(weight)
  return 0 if weight.nil? || weight == 0

  start_range = (weight * 100).ceil.to_i
  [start_range, MAX_TRAFFIC_VALUE].min
end
is_part_of_group(settings_file, campaign_id) click to toggle source

Checks whether a campaign is part of a group.

@param[Hash]       :settings_file          Settings file for the project
@param[Integer]     :campaign_id            Id of campaign which is to be checked
@return[Boolean]
# File lib/vwo/utils/campaign.rb, line 277
def is_part_of_group(settings_file, campaign_id)
  if settings_file["campaignGroups"] && (settings_file["campaignGroups"].has_key?(campaign_id.to_s))
    return true
  end
  false
end
validate_goal(goal, goal_type_to_track) click to toggle source
# File lib/vwo/utils/campaign.rb, line 220
def validate_goal(goal, goal_type_to_track)
  result = goal && (
    goal_type_to_track == 'ALL' ||
      (
        GOAL_TYPES.has_value?(goal['type']) &&
          (GOAL_TYPES.key? goal_type_to_track) &&
          goal['type'] == GOAL_TYPES[goal_type_to_track]
      )
  )
  return result
end