4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
# File 'lib/trail_guide/experiments/conversion.rb', line 4
def convert!(checkpoint=nil, metadata: nil)
if !started?
return false unless enable_calibration?
variant = participant.variant
return false unless variant.present? && variant == control
else
return false unless running?
variant = participant.variant
return false unless variant.present?
if winner?
return false unless track_winner_conversions? && variant == winner
end
end
if checkpoint.nil?
raise InvalidGoalError, "You must provide a valid goal checkpoint for `#{experiment_name}`." unless goals.empty?
else
goal = goals.find { |g| g == checkpoint }
raise InvalidGoalError, "Invalid goal checkpoint `#{checkpoint}` for `#{experiment_name}`." if goal.nil?
checkpoint = goal
end
if participant.converted?(checkpoint)
return false unless (checkpoint.nil? && allow_multiple_conversions?) || (checkpoint.present? && checkpoint.allow_multiple_conversions?)
elsif participant.converted?
return false unless allow_multiple_goals?
end
return false unless allow_conversion?(variant, checkpoint, metadata)
participant.converted!(variant, checkpoint, reset: !reset_manually?)
variant.increment_conversion!(checkpoint)
if checkpoint.nil?
run_callbacks(:on_convert, checkpoint, variant, participant, metadata)
else
checkpoint.run_callbacks(:on_convert, self, variant, participant, metadata)
end
variant
rescue Errno::ECONNREFUSED, Redis::BaseError, SocketError => e
run_callbacks(:on_redis_failover, e)
return false
end
|