abongo 1.0.6 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/abongo.rb +1 -1
- data/lib/abongo.rb~ +42 -18
- data/lib/abongo/version.rb +1 -1
- data/lib/abongo/version.rb~ +4 -0
- data/lib/abongo/views/dashboard/_experiment.html.erb +2 -2
- data/lib/abongo/views/dashboard/_experiment.html.erb~ +43 -0
- metadata +5 -3
data/lib/abongo.rb
CHANGED
data/lib/abongo.rb~
CHANGED
@@ -1,9 +1,15 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
if defined? Rails
|
2
|
+
require 'abongo/sugar'
|
3
|
+
require 'abongo/view_helper'
|
4
|
+
require 'abongo/controller/dashboard'
|
5
|
+
ActionController::Base.send :include, Abongo::Sugar
|
6
|
+
ActionView::Base.send :include, Abongo::ViewHelper
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'abongo/version'
|
10
|
+
require 'abongo/statistics'
|
6
11
|
|
12
|
+
class Abongo
|
7
13
|
@@options ||= {}
|
8
14
|
def self.options; @@options; end
|
9
15
|
def self.options=(options); @@options = options; end
|
@@ -29,7 +35,6 @@ class Abongo
|
|
29
35
|
@@identity ||= rand(10 ** 10)
|
30
36
|
end
|
31
37
|
|
32
|
-
# TODO: add options
|
33
38
|
def self.flip(test_name, options = {})
|
34
39
|
if block_given?
|
35
40
|
yield(self.test(test_name, [true, false], options))
|
@@ -65,6 +70,7 @@ class Abongo
|
|
65
70
|
# Small timing issue in here
|
66
71
|
if (!@@options[:count_humans_only] || participant['human'])
|
67
72
|
Abongo.alternatives.update({:content => choice, :test => test['_id']}, {:$inc => {:participants => 1}})
|
73
|
+
Abongo.experiments.update({:_id => test['_id']}, {'$inc' => {:participants => 1}})
|
68
74
|
end
|
69
75
|
end
|
70
76
|
|
@@ -95,7 +101,6 @@ class Abongo
|
|
95
101
|
self.score_conversion!(test)
|
96
102
|
end
|
97
103
|
else # No tests listening for this conversion. Assume it is just a test name
|
98
|
-
puts name.inspect
|
99
104
|
if name.kind_of? BSON::ObjectId
|
100
105
|
self.score_conversion!(name)
|
101
106
|
else
|
@@ -117,6 +122,7 @@ class Abongo
|
|
117
122
|
test = Abongo.experiments.find_one(:_id => test_name)
|
118
123
|
viewed_alternative = Abongo.find_alternative_for_user(Abongo.identity, test)
|
119
124
|
Abongo.alternatives.update({:content => viewed_alternative, :test => test['_id']}, {'$inc' => {:conversions => 1}})
|
125
|
+
Abongo.experiments.update({:_id => test_name}, {'$inc' => {:conversions => 1}})
|
120
126
|
end
|
121
127
|
end
|
122
128
|
end
|
@@ -153,16 +159,22 @@ class Abongo
|
|
153
159
|
tests_and_alternatives
|
154
160
|
end
|
155
161
|
|
162
|
+
def self.is_human?(identity = nil)
|
163
|
+
identity ||= Abongo.identity
|
164
|
+
participant = Abongo.participants.find_one(:identity => identity)
|
165
|
+
return !!(participant && participant["human"])
|
166
|
+
end
|
167
|
+
|
156
168
|
def self.human!(identity = nil)
|
157
169
|
identity ||= Abongo.identity
|
158
170
|
begin
|
159
171
|
previous = Abongo.participants.find_and_modify({'query' => {:identity => identity}, 'update' => {'$set' => {:human => true}}, 'upsert' => true})
|
160
172
|
rescue Mongo::OperationFailure
|
161
|
-
Abongo.participants.update({:identity => identity}, {'$set' => {:human => true}}, :upsert => true
|
173
|
+
Abongo.participants.update({:identity => identity}, {'$set' => {:human => true}}, :upsert => true)
|
162
174
|
previous = Abongo.participants.find_one(:identity => identity)
|
163
175
|
end
|
164
176
|
|
165
|
-
|
177
|
+
if !previous['human'] and options[:count_humans_only]
|
166
178
|
if options[:expires_in_for_bots] and previous['tests']
|
167
179
|
Abongo.set_expiration(Abongo.identity, expires_in(true))
|
168
180
|
end
|
@@ -171,7 +183,8 @@ class Abongo
|
|
171
183
|
previous['tests'].each do |test_id|
|
172
184
|
test = Abongo.experiments.find_one(test_id)
|
173
185
|
choice = Abongo.find_alternative_for_user(identity, test)
|
174
|
-
Abongo.alternatives.update({:content => choice, :test =>
|
186
|
+
Abongo.alternatives.update({:content => choice, :test => test_id}, {:$inc => {:participants => 1}})
|
187
|
+
Abongo.experiments.update({:_id => test_id}, {'$inc' => {:participants => 1}})
|
175
188
|
end
|
176
189
|
end
|
177
190
|
|
@@ -179,7 +192,8 @@ class Abongo
|
|
179
192
|
previous['conversions'].each do |test_id|
|
180
193
|
test = Abongo.experiments.find_one(:_id => test_id)
|
181
194
|
viewed_alternative = Abongo.find_alternative_for_user(identity, test)
|
182
|
-
Abongo.alternatives.update({:content => viewed_alternative, :test =>
|
195
|
+
Abongo.alternatives.update({:content => viewed_alternative, :test => test_id}, {'$inc' => {:conversions => 1}})
|
196
|
+
Abongo.experiments.update({:_id => test_id}, {'$inc' => {:conversions => 1}})
|
183
197
|
end
|
184
198
|
end
|
185
199
|
end
|
@@ -187,7 +201,9 @@ class Abongo
|
|
187
201
|
|
188
202
|
def self.end_experiment!(test_name, final_alternative, conversion_name = nil)
|
189
203
|
warn("conversion_name is deprecated") if conversion_name
|
190
|
-
|
204
|
+
test = get_test(test_name)
|
205
|
+
Abongo.experiments.update({:name => test_name}, {'$set' => { :final => final_alternative}}, :upsert => true, :safe => true)
|
206
|
+
Abongo.conversions.update({'tests' => test['_id']}, {'$pull' => {'tests' => test['_id']}}, :multi => true)
|
191
207
|
end
|
192
208
|
|
193
209
|
protected
|
@@ -230,8 +246,16 @@ class Abongo
|
|
230
246
|
Abongo.experiments.find.to_a
|
231
247
|
end
|
232
248
|
|
233
|
-
def self.get_test(
|
234
|
-
Abongo.experiments.find_one({:name =>
|
249
|
+
def self.get_test(test)
|
250
|
+
Abongo.experiments.find_one({:name => test}) || Abongo.experiments.find_one({:_id => test}) || nil
|
251
|
+
end
|
252
|
+
|
253
|
+
def self.get_alternatives(test_id)
|
254
|
+
Abongo.alternatives.find({:test => test_id})
|
255
|
+
end
|
256
|
+
|
257
|
+
def self.get_alternative(alternative_id)
|
258
|
+
Abongo.alternatives.find_one({:_id => BSON::ObjectId(alternative_id)})
|
235
259
|
end
|
236
260
|
|
237
261
|
def self.tests_listening_to_conversion(conversion)
|
@@ -243,7 +267,7 @@ class Abongo
|
|
243
267
|
def self.start_experiment!(test_name, alternatives_array, conversion_name = nil)
|
244
268
|
conversion_name ||= test_name
|
245
269
|
|
246
|
-
Abongo.experiments.update({:name => test_name}, {:$set => {
|
270
|
+
Abongo.experiments.update({:name => test_name}, {:$set => {:alternatives => alternatives_array}, :$inc => {:participants => 0, :conversions => 0}}, :upsert => true, :safe => true)
|
247
271
|
test = Abongo.experiments.find_one({:name => test_name})
|
248
272
|
|
249
273
|
# This could be a lot more elegant
|
@@ -270,13 +294,13 @@ class Abongo
|
|
270
294
|
|
271
295
|
def self.add_participation(identity, test_id, expires_in = nil)
|
272
296
|
if expires_in.nil?
|
273
|
-
Abongo.participants.update({:identity => identity}, {'$addToSet' => {:tests => test_id}}, :upsert => true
|
297
|
+
Abongo.participants.update({:identity => identity}, {'$addToSet' => {:tests => test_id}}, :upsert => true)
|
274
298
|
else
|
275
|
-
Abongo.participants.update({:identity => identity}, {'$addToSet' => {:tests => test_id}, '$set' => {:expires => Time.now + expires_in}}, :upsert => true
|
299
|
+
Abongo.participants.update({:identity => identity}, {'$addToSet' => {:tests => test_id}, '$set' => {:expires => Time.now + expires_in}}, :upsert => true)
|
276
300
|
end
|
277
301
|
end
|
278
302
|
|
279
303
|
def self.set_expiration(identity, expires_in)
|
280
|
-
Abongo.participants.update({:identity => identity}, {'$set' => {:expires => Time.now + expires_in}}, :upsert => true
|
304
|
+
Abongo.participants.update({:identity => identity}, {'$set' => {:expires => Time.now + expires_in}}, :upsert => true)
|
281
305
|
end
|
282
306
|
end
|
data/lib/abongo/version.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
<h3><%= experiment['name'].titleize %> <%= %Q|(Test completed)|
|
1
|
+
<h3><%= experiment['name'].titleize %> <%= %Q|(Test completed)| unless experiment['final'].nil? %> </h3>
|
2
2
|
<table class="experiment" style="border: 1px black;">
|
3
3
|
<tr class="header_row">
|
4
4
|
<th>Name</th>
|
@@ -21,7 +21,7 @@
|
|
21
21
|
<td><%= alternative['participants'] %></td>
|
22
22
|
<td><%= alternative['conversions'] %> (<%= Abongo::Statistics.pretty_conversion_rate(alternative) %>)</td>
|
23
23
|
<td>
|
24
|
-
<%
|
24
|
+
<% if experiment['final'].nil? %>
|
25
25
|
<%= link_to("End experiment, picking this.", url_for(:id => alternative['_id'],
|
26
26
|
:action => "end_experiment"),
|
27
27
|
:method => :post,
|
@@ -0,0 +1,43 @@
|
|
1
|
+
<h3><%= experiment['name'].titleize %> <%= %Q|(Test completed)| if experiment['final'] %> </h3>
|
2
|
+
<table class="experiment" style="border: 1px black;">
|
3
|
+
<tr class="header_row">
|
4
|
+
<th>Name</th>
|
5
|
+
<th>Participants</th>
|
6
|
+
<th>Conversions</th>
|
7
|
+
<th>Notes</th>
|
8
|
+
</tr>
|
9
|
+
<tr class="experiment_row">
|
10
|
+
<td>Experiment Total: </td>
|
11
|
+
<td><%= experiment['participants'] %> </td>
|
12
|
+
<td><%= experiment['conversions'] %> (<%= Abongo::Statistics.pretty_conversion_rate(experiment) %>)</td>
|
13
|
+
<td></td>
|
14
|
+
</tr>
|
15
|
+
<% alternatives = Abongo.get_alternatives(experiment['_id']).to_a %>
|
16
|
+
<% alternatives.each do |alternative| %>
|
17
|
+
<tr class="alternative_row">
|
18
|
+
<td>
|
19
|
+
<%= h alternative['content'] %>
|
20
|
+
</td>
|
21
|
+
<td><%= alternative['participants'] %></td>
|
22
|
+
<td><%= alternative['conversions'] %> (<%= Abongo::Statistics.pretty_conversion_rate(alternative) %>)</td>
|
23
|
+
<td>
|
24
|
+
<% unless experiment['final'] %>
|
25
|
+
<%= link_to("End experiment, picking this.", url_for(:id => alternative['_id'],
|
26
|
+
:action => "end_experiment"),
|
27
|
+
:method => :post,
|
28
|
+
:confirm => "Are you sure you want to terminate this experiment? This is not reversible."
|
29
|
+
) %>
|
30
|
+
<% else %>
|
31
|
+
<% if alternative['content'] == experiment['final'] %>
|
32
|
+
<b>(All users seeing this.)</b>
|
33
|
+
<% end %>
|
34
|
+
<% end %>
|
35
|
+
</td>
|
36
|
+
</tr>
|
37
|
+
<% end %>
|
38
|
+
<tr>
|
39
|
+
<td colspan="4">
|
40
|
+
<b>Significance test results: </b><%= Abongo::Statistics.describe_result_in_words(experiment, alternatives) %>
|
41
|
+
</td>
|
42
|
+
</tr>
|
43
|
+
</table>
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 1.0.
|
8
|
+
- 7
|
9
|
+
version: 1.0.7
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Michael Fairley
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-04-
|
17
|
+
date: 2011-04-28 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -57,8 +57,10 @@ files:
|
|
57
57
|
- lib/abongo/statistics.rb
|
58
58
|
- lib/abongo/sugar.rb
|
59
59
|
- lib/abongo/version.rb
|
60
|
+
- lib/abongo/version.rb~
|
60
61
|
- lib/abongo/view_helper.rb
|
61
62
|
- lib/abongo/views/dashboard/_experiment.html.erb
|
63
|
+
- lib/abongo/views/dashboard/_experiment.html.erb~
|
62
64
|
- lib/abongo/views/dashboard/index.html.erb
|
63
65
|
- lib/abongo.rb
|
64
66
|
- lib/abongo.rb~
|