Sha256: 681dfe6c877fce876d685b2cf7f68c9d884ea8fcd3a3e83ecd1944ed89d33246

Contents?: true

Size: 1.44 KB

Versions: 1

Compression:

Stored size: 1.44 KB

Contents

class Verdict::RolloutSegmenter < Verdict::Segmenter

  class Group < Verdict::Group

    attr_reader :percentile_range

    def initialize(experiment, handle, percentile_range)
      super(experiment, handle)
      @percentile_range = percentile_range
    end

    def percentage_size
      percentile_range.end - percentile_range.begin
    end

    def to_s
      "#{handle} (#{percentage_size}%)"
    end

    def as_json(options = {})
      super(options).merge(percentage: percentage_size)
    end
  end

  def initialize(experiment)
    super
    @total_percentage_segmented = 0
  end

  def verify!
    raise Verdict::SegmentationError, "Should segment less than 100% of the cases, but segments add up to #{@total_percentage_segmented}%." if @total_percentage_segmented >= 100
  end

  def register_group(handle, size)
    percentage = size.kind_of?(Hash) && size[:percentage] ? size[:percentage] : size
    n = case percentage
      when :rest; 100 - @total_percentage_segmented
      when :half; 50
      when Integer; percentage
      else Integer(percentage)
    end

    group = Group.new(experiment, handle, @total_percentage_segmented ... (@total_percentage_segmented + n))
    @total_percentage_segmented += n
    return group
  end

  def assign(identifier, subject, context)
    percentile = Digest::MD5.hexdigest("#{@experiment.handle}#{identifier}").to_i(16) % 100
    groups.values.find { |group| group.percentile_range.include?(percentile) }
  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
verdict-0.2.0 lib/verdict/rollout_segmenter.rb