lib/split/configuration.rb in split-0.4.6 vs lib/split/configuration.rb in split-0.5.0
- old
+ new
@@ -1,21 +1,111 @@
module Split
class Configuration
+ BOTS = {
+ 'Baidu' => 'Chinese spider',
+ 'Gigabot' => 'Gigabot spider',
+ 'Googlebot' => 'Google spider',
+ 'libwww-perl' => 'Perl client-server library loved by script kids',
+ 'lwp-trivial' => 'Another Perl library loved by script kids',
+ 'msnbot' => 'Microsoft bot',
+ 'SiteUptime' => 'Site monitoring services',
+ 'Slurp' => 'Yahoo spider',
+ 'WordPress' => 'WordPress spider',
+ 'ZIBB' => 'ZIBB spider',
+ 'ZyBorg' => 'Zyborg? Hmmm....'
+ }
attr_accessor :robot_regex
attr_accessor :ignore_ip_addresses
attr_accessor :db_failover
attr_accessor :db_failover_on_db_error
attr_accessor :db_failover_allow_parameter_override
attr_accessor :allow_multiple_experiments
attr_accessor :enabled
+ attr_accessor :experiments
+ attr_accessor :persistence
+ attr_accessor :algorithm
+ def disabled?
+ !enabled
+ end
+
+ def experiment_for(name)
+ if normalized_experiments
+ normalized_experiments[name]
+ end
+ end
+
+ def metrics
+ return @metrics if defined?(@metrics)
+ @metrics = {}
+ if self.experiments
+ self.experiments.each do |key, value|
+ metric_name = value[:metric]
+ if metric_name
+ @metrics[metric_name] ||= []
+ @metrics[metric_name] << Split::Experiment.load_from_configuration(key)
+ end
+ end
+ end
+ @metrics
+ end
+
+ def normalized_experiments
+ if @experiments.nil?
+ nil
+ else
+ experiment_config = {}
+ @experiments.keys.each do | name |
+ experiment_config[name] = {}
+ end
+ @experiments.each do | experiment_name, settings|
+ experiment_config[experiment_name][:alternatives] = normalize_alternatives(settings[:alternatives]) if settings[:alternatives]
+ end
+ experiment_config
+ end
+ end
+
+
+ def normalize_alternatives(alternatives)
+ given_probability, num_with_probability = alternatives.inject([0,0]) do |a,v|
+ p, n = a
+ if v.kind_of?(Hash) && v[:percent]
+ [p + v[:percent], n + 1]
+ else
+ a
+ end
+ end
+
+ num_without_probability = alternatives.length - num_with_probability
+ unassigned_probability = ((100.0 - given_probability) / num_without_probability / 100.0)
+
+ if num_with_probability.nonzero?
+ alternatives = alternatives.map do |v|
+ if v.kind_of?(Hash) && v[:name] && v[:percent]
+ { v[:name] => v[:percent] / 100.0 }
+ elsif v.kind_of?(Hash) && v[:name]
+ { v[:name] => unassigned_probability }
+ else
+ { v => unassigned_probability }
+ end
+ end
+ [alternatives.shift, alternatives]
+ else
+ alternatives = alternatives.dup
+ [alternatives.shift, alternatives]
+ end
+ end
+
def initialize
- @robot_regex = /\b(Baidu|Gigabot|Googlebot|libwww-perl|lwp-trivial|msnbot|SiteUptime|Slurp|WordPress|ZIBB|ZyBorg)\b/i
+ @robot_regex = /\b(#{BOTS.keys.join('|')})\b/i
@ignore_ip_addresses = []
@db_failover = false
@db_failover_on_db_error = proc{|error|} # e.g. use Rails logger here
@db_failover_allow_parameter_override = false
@allow_multiple_experiments = false
@enabled = true
+ @experiments = {}
+ @persistence = Split::Persistence::SessionAdapter
+ @algorithm = Split::Algorithms::WeightedSample
end
end
end