Module: Split::Helper
- Included in:
- EncapsulatedHelper::ContextShim
- Defined in:
- lib/split/helper.rb
Class Method Summary collapse
- .ab_test(metric_descriptor, control = nil, *alternatives) ⇒ Object
- .ab_user ⇒ Object
- .active_experiments ⇒ Object
- .begin_experiment(experiment, alternative_name = nil) ⇒ Object
- .control_variable(control) ⇒ Object
- .exclude_visitor? ⇒ Boolean
- .finish_experiment(experiment, options = {:reset => true}) ⇒ Object
- .finished(metric_descriptor, options = {:reset => true}) ⇒ Object
- .is_ignored_ip_address? ⇒ Boolean
- .is_robot? ⇒ Boolean
- .normalize_metric(metric_descriptor) ⇒ Object
- .override_alternative(experiment_name) ⇒ Object
- .override_present?(experiment_name) ⇒ Boolean
- .reset!(experiment) ⇒ Object
- .split_generically_disabled? ⇒ Boolean
Class Method Details
.ab_test(metric_descriptor, control = nil, *alternatives) ⇒ Object
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 |
# File 'lib/split/helper.rb', line 6 def ab_test(metric_descriptor, control = nil, *alternatives) begin experiment = ExperimentCatalog.find_or_initialize(metric_descriptor, control, *alternatives) alternative = if Split.configuration.enabled experiment.save trial = Trial.new(:user => ab_user, :experiment => experiment, :override => override_alternative(experiment.name), :exclude => exclude_visitor?, :disabled => split_generically_disabled?) alt = trial.choose!(self) alt ? alt.name : nil else control_variable(experiment.control) end rescue Errno::ECONNREFUSED, Redis::BaseError, SocketError => e raise(e) unless Split.configuration.db_failover Split.configuration.db_failover_on_db_error.call(e) if Split.configuration.db_failover_allow_parameter_override alternative = override_alternative(experiment.name) if override_present?(experiment.name) alternative = control_variable(experiment.control) if split_generically_disabled? end ensure alternative ||= control_variable(experiment.control) end if block_given? = trial ? trial. : {} yield(alternative, ) else alternative end end |
.ab_user ⇒ Object
96 97 98 |
# File 'lib/split/helper.rb', line 96 def ab_user @ab_user ||= Split::Persistence.adapter.new(self) end |
.active_experiments ⇒ Object
117 118 119 120 121 122 123 124 125 126 127 128 |
# File 'lib/split/helper.rb', line 117 def active_experiments experiment_pairs = {} ab_user.keys.each do |key| key_without_version = key.split(/\:\d(?!\:)/)[0] Metric.possible_experiments(key_without_version).each do |experiment| if !experiment.has_winner? experiment_pairs[key_without_version] = ab_user[key] end end end return experiment_pairs end |
.begin_experiment(experiment, alternative_name = nil) ⇒ Object
90 91 92 93 94 |
# File 'lib/split/helper.rb', line 90 def begin_experiment(experiment, alternative_name = nil) alternative_name ||= experiment.control.name ab_user[experiment.key] = alternative_name alternative_name end |
.control_variable(control) ⇒ Object
141 142 143 |
# File 'lib/split/helper.rb', line 141 def control_variable(control) Hash === control ? control.keys.first.to_s : control.to_s end |
.exclude_visitor? ⇒ Boolean
100 101 102 |
# File 'lib/split/helper.rb', line 100 def exclude_visitor? instance_eval(&Split.configuration.ignore_filter) || is_ignored_ip_address? || is_robot? end |
.finish_experiment(experiment, options = {:reset => true}) ⇒ Object
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/split/helper.rb', line 44 def finish_experiment(experiment, = {:reset => true}) return true if experiment.has_winner? should_reset = experiment.resettable? && [:reset] if ab_user[experiment.finished_key] && !should_reset return true else alternative_name = ab_user[experiment.key] trial = Trial.new(:user => ab_user, :experiment => experiment, :alternative => alternative_name) trial.complete!([:goals], self) if should_reset reset!(experiment) else ab_user[experiment.finished_key] = true end end end |
.finished(metric_descriptor, options = {:reset => true}) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/split/helper.rb', line 63 def finished(metric_descriptor, = {:reset => true}) return if exclude_visitor? || Split.configuration.disabled? metric_descriptor, goals = normalize_metric(metric_descriptor) experiments = Metric.possible_experiments(metric_descriptor) if experiments.any? experiments.each do |experiment| finish_experiment(experiment, .merge(:goals => goals)) end end rescue => e raise unless Split.configuration.db_failover Split.configuration.db_failover_on_db_error.call(e) end |
.is_ignored_ip_address? ⇒ Boolean
108 109 110 111 112 113 114 115 |
# File 'lib/split/helper.rb', line 108 def is_ignored_ip_address? return false if Split.configuration.ignore_ip_addresses.empty? Split.configuration.ignore_ip_addresses.each do |ip| return true if defined?(request) && (request.ip == ip || (ip.class == Regexp && request.ip =~ ip)) end false end |
.is_robot? ⇒ Boolean
104 105 106 |
# File 'lib/split/helper.rb', line 104 def is_robot? defined?(request) && request.user_agent =~ Split.configuration.robot_regex end |
.normalize_metric(metric_descriptor) ⇒ Object
130 131 132 133 134 135 136 137 138 139 |
# File 'lib/split/helper.rb', line 130 def normalize_metric(metric_descriptor) if Hash === metric_descriptor experiment_name = metric_descriptor.keys.first goals = Array(metric_descriptor.values.first) else experiment_name = metric_descriptor goals = [] end return experiment_name, goals end |
.override_alternative(experiment_name) ⇒ Object
82 83 84 |
# File 'lib/split/helper.rb', line 82 def override_alternative(experiment_name) params[experiment_name] if override_present?(experiment_name) end |
.override_present?(experiment_name) ⇒ Boolean
78 79 80 |
# File 'lib/split/helper.rb', line 78 def override_present?(experiment_name) defined?(params) && params[experiment_name] end |
.reset!(experiment) ⇒ Object
40 41 42 |
# File 'lib/split/helper.rb', line 40 def reset!(experiment) ab_user.delete(experiment.key) end |
.split_generically_disabled? ⇒ Boolean
86 87 88 |
# File 'lib/split/helper.rb', line 86 def split_generically_disabled? defined?(params) && params['SPLIT_DISABLE'] end |