Sha256: 626b546dd3e6b786fe704b9c3db0da42353d9085f62089f447b2799b939c1c98

Contents?: true

Size: 1.66 KB

Versions: 3

Compression:

Stored size: 1.66 KB

Contents

class TestTrack::AbConfiguration
  include TestTrack::RequiredOptions

  def initialize(opts)
    @split_name = require_option!(opts, :split_name).to_s
    true_variant = require_option!(opts, :true_variant, allow_nil: true)
    @split_registry = require_option!(opts, :split_registry)
    raise ArgumentError, "unknown opts: #{opts.keys.to_sentence}" if opts.present?

    @true_variant = true_variant.to_s if true_variant

    raise ArgumentError, unknown_split_error_message if @split_registry.loaded? && !split
  end

  def variants
    @variants ||= build_variant_hash
  end

  private

  def build_variant_hash
    notify_because_ab("configures split with more than 2 variants") if split_variants && split_variants.size > 2
    { true: true_variant, false: false_variant } # rubocop:disable Lint/BooleanSymbol
  end

  def true_variant
    @true_variant ||= true
  end

  def false_variant
    @false_variant ||= non_true_variants.present? ? non_true_variants.min : false
  end

  attr_reader :split_name, :split_registry

  def unknown_split_error_message
    error_message = "unknown split: #{split_name}."
    error_message << " You may need to run rake test_track:schema:load" if Rails.env.development?
    error_message
  end

  def split
    @split ||= split_registry.weights_for(split_name)
  end

  def split_variants
    @split_variants ||= split.keys if split
  end

  def non_true_variants
    split_variants - [true_variant.to_s] if split_variants
  end

  def notify_because_ab(msg)
    misconfiguration_notifier.notify("A/B for \"#{split_name}\" #{msg}")
  end

  def misconfiguration_notifier
    @misconfiguration_notifier ||= TestTrack.misconfiguration_notifier
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
test_track_rails_client-8.0.0 app/models/test_track/ab_configuration.rb
test_track_rails_client-7.1.2 app/models/test_track/ab_configuration.rb
test_track_rails_client-7.1.1 app/models/test_track/ab_configuration.rb