Class: Vanity::Experiment::Base
Overview
Base class that all experiment types are derived from.
Direct Known Subclasses
Instance Attribute Summary (collapse)
-
- (Object) completed_at
readonly
Time stamp when experiment was completed.
-
- (Object) id
readonly
Unique identifier, derived from name experiment name, e.g.
-
- (Object) name
(also: #to_s)
readonly
Human readable experiment name (first argument you pass when creating a new experiment).
-
- (Object) playground
readonly
Returns the value of attribute playground.
Class Method Summary (collapse)
-
+ (Object) load(playground, stack, file)
Playground uses this to load experiment definitions.
-
+ (Object) type
Returns the type of this class as a symbol (e.g. AbTest becomes ab_test).
Instance Method Summary (collapse)
-
- (Boolean) active?
Returns true if experiment active, false if completed.
-
- (Object) complete!
Force experiment to complete.
-
- (Object) complete_if(&block)
Define experiment completion condition.
-
- (Object) created_at
Time stamp when experiment was created.
-
- (Object) description(text = nil)
Sets or returns description.
-
- (Object) destroy
Get rid of all experiment data.
-
- (Object) identify(&block)
Defines how we obtain an identity for the current experiment.
-
- (Base) initialize(playground, id, name, options = nil)
constructor
A new instance of Base.
-
- (Object) save
Called by Playground to save the experiment definition.
-
- (Object) type
Returns the type of this experiment as a symbol (e.g. :ab_test).
Constructor Details
- (Base) initialize(playground, id, name, options = nil)
A new instance of Base
67 68 69 70 71 72 |
# File 'lib/vanity/experiment/base.rb', line 67 def initialize(playground, id, name, = nil) @playground = playground @id, @name = id.to_sym, name @options = || {} @identify_block = method(:default_identify) end |
Instance Attribute Details
- (Object) completed_at (readonly)
Time stamp when experiment was completed.
91 92 93 |
# File 'lib/vanity/experiment/base.rb', line 91 def completed_at @completed_at ||= connection.get_experiment_completed_at(@id) end |
- (Object) id (readonly)
Unique identifier, derived from name experiment name, e.g. “Green Button” becomes :green_button.
81 82 83 |
# File 'lib/vanity/experiment/base.rb', line 81 def id @id end |
- (Object) name (readonly) Also known as: to_s
Human readable experiment name (first argument you pass when creating a new experiment).
76 77 78 |
# File 'lib/vanity/experiment/base.rb', line 76 def name @name end |
- (Object) playground (readonly)
Returns the value of attribute playground
83 84 85 |
# File 'lib/vanity/experiment/base.rb', line 83 def playground @playground end |
Class Method Details
+ (Object) load(playground, stack, file)
Playground uses this to load experiment definitions.
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/vanity/experiment/base.rb', line 45 def load(playground, stack, file) fail "Circular dependency detected: #{stack.join('=>')}=>#{file}" if stack.include?(file) source = File.read(file) stack.push file id = File.basename(file, ".rb").downcase.gsub(/\W/, "_").to_sym context = Object.new context.instance_eval do extend Definition experiment = eval(source, context.new_binding(playground, id), file) fail NameError.new("Expected #{file} to define experiment #{id}", id) unless playground.experiments[id] experiment end rescue error = NameError.exception($!., id) error.set_backtrace $!.backtrace raise error ensure stack.pop end |
+ (Object) type
Returns the type of this class as a symbol (e.g. AbTest becomes ab_test).
40 41 42 |
# File 'lib/vanity/experiment/base.rb', line 40 def type name.split("::").last.gsub(/([a-z])([A-Z])/) { "#{$1}_#{$2}" }.gsub(/([A-Z])([A-Z][a-z])/) { "#{$1}_#{$2}" }.downcase end |
Instance Method Details
- (Boolean) active?
Returns true if experiment active, false if completed.
157 158 159 |
# File 'lib/vanity/experiment/base.rb', line 157 def active? !@playground.collecting? || !connection.is_experiment_completed?(@id) end |
- (Object) complete!
Force experiment to complete.
144 145 146 147 148 149 |
# File 'lib/vanity/experiment/base.rb', line 144 def complete! @playground.logger.info "vanity: completed experiment #{id}" return unless @playground.collecting? connection.set_experiment_completed_at @id, Time.now @completed_at = connection.get_experiment_completed_at(@id) end |
- (Object) complete_if(&block)
Define experiment completion condition. For example:
complete_if do !score(95).chosen.nil? end
137 138 139 140 141 |
# File 'lib/vanity/experiment/base.rb', line 137 def complete_if(&block) raise ArgumentError, "Missing block" unless block raise "complete_if already called on this experiment" if @complete_block @complete_block = block end |
- (Object) created_at
Time stamp when experiment was created.
86 87 88 |
# File 'lib/vanity/experiment/base.rb', line 86 def created_at @created_at ||= connection.get_experiment_created_at(@id) end |
- (Object) description(text = nil)
Sets or returns description. For example
ab_test "Simple" do description "A simple A/B experiment" end puts "Just defined: " + experiment(:simple).description
125 126 127 128 |
# File 'lib/vanity/experiment/base.rb', line 125 def description(text = nil) @description = text if text @description end |
- (Object) destroy
Get rid of all experiment data.
164 165 166 167 |
# File 'lib/vanity/experiment/base.rb', line 164 def destroy connection.destroy_experiment @id @created_at = @completed_at = nil end |
- (Object) identify(&block)
Defines how we obtain an identity for the current experiment. Usually Vanity gets the identity form a session object (see use_vanity), but there are cases where you want a particular experiment to use a different identity.
For example, if all your experiments use current_user and you need one experiment to use the current project:
ab_test "Project widget" do alternatives :small, :medium, :large identify do |controller| controller.project.id end end
111 112 113 114 |
# File 'lib/vanity/experiment/base.rb', line 111 def identify(&block) fail "Missing block" unless block @identify_block = block end |
- (Object) save
Called by Playground to save the experiment definition.
170 171 172 173 |
# File 'lib/vanity/experiment/base.rb', line 170 def save return unless @playground.collecting? connection.set_experiment_created_at @id, Time.now end |
- (Object) type
Returns the type of this experiment as a symbol (e.g. :ab_test).
94 95 96 |
# File 'lib/vanity/experiment/base.rb', line 94 def type self.class.type end |