vanity 2.0.0.beta7 → 2.0.0.beta8

Sign up to get free protection for your applications and to get access to all the features.
@@ -7,13 +7,14 @@ GIT
7
7
  PATH
8
8
  remote: ..
9
9
  specs:
10
- vanity (2.0.0.beta7)
10
+ vanity (2.0.0.beta8)
11
11
  i18n
12
12
 
13
13
  GEM
14
14
  remote: https://rubygems.org/
15
15
  specs:
16
16
  RedCloth (4.2.9)
17
+ RedCloth (4.2.9-java)
17
18
  actionmailer (4.2.0)
18
19
  actionpack (= 4.2.0)
19
20
  actionview (= 4.2.0)
@@ -43,6 +44,8 @@ GEM
43
44
  activemodel (= 4.2.0)
44
45
  activesupport (= 4.2.0)
45
46
  arel (~> 6.0)
47
+ activerecord-jdbc-adapter (1.3.15)
48
+ activerecord (>= 2.2)
46
49
  activesupport (4.2.0)
47
50
  i18n (~> 0.7)
48
51
  json (~> 1.7, >= 1.7.7)
@@ -57,6 +60,7 @@ GEM
57
60
  arel (6.0.0)
58
61
  blankslate (2.1.2.4)
59
62
  bson (1.10.0)
63
+ bson (1.10.0-java)
60
64
  bson_ext (1.10.0)
61
65
  bson (~> 1.10.0)
62
66
  builder (3.2.2)
@@ -64,18 +68,18 @@ GEM
64
68
  timers (~> 4.0.0)
65
69
  classifier-reborn (2.0.3)
66
70
  fast-stemmer (~> 1.0)
67
- coffee-script (2.3.0)
71
+ coffee-script (2.4.1)
68
72
  coffee-script-source
69
73
  execjs
70
- coffee-script-source (1.8.0)
74
+ coffee-script-source (1.9.1)
71
75
  colorator (0.1)
72
76
  crack (0.4.2)
73
77
  safe_yaml (~> 1.0.0)
74
78
  daemon_controller (1.2.0)
75
79
  erubis (2.7.0)
76
- execjs (2.2.2)
80
+ execjs (2.5.2)
77
81
  fast-stemmer (1.0.2)
78
- ffi (1.9.6)
82
+ ffi (1.9.8)
79
83
  garb (0.9.1)
80
84
  activesupport (>= 2.2.0)
81
85
  crack (>= 0.1.6)
@@ -85,6 +89,7 @@ GEM
85
89
  hitimes (1.2.2)
86
90
  i18n (0.7.0)
87
91
  integration (0.1.0)
92
+ jdbc-sqlite3 (3.8.7)
88
93
  jekyll (2.5.3)
89
94
  classifier-reborn (~> 2.0)
90
95
  colorator (~> 0.1)
@@ -102,17 +107,18 @@ GEM
102
107
  toml (~> 0.1.0)
103
108
  jekyll-coffeescript (1.0.1)
104
109
  coffee-script (~> 2.2)
105
- jekyll-gist (1.1.0)
110
+ jekyll-gist (1.2.1)
106
111
  jekyll-paginate (1.1.0)
107
112
  jekyll-sass-converter (1.3.0)
108
113
  sass (~> 3.2)
109
- jekyll-watch (1.2.0)
114
+ jekyll-watch (1.2.1)
110
115
  listen (~> 2.7)
111
116
  json (1.8.2)
112
- kramdown (1.5.0)
113
- liquid (2.6.1)
114
- listen (2.8.5)
115
- celluloid (>= 0.15.2)
117
+ json (1.8.2-java)
118
+ kramdown (1.6.0)
119
+ liquid (2.6.2)
120
+ listen (2.10.0)
121
+ celluloid (~> 0.16.0)
116
122
  rb-fsevent (>= 0.9.3)
117
123
  rb-inotify (>= 0.9)
118
124
  loofah (2.0.1)
@@ -128,9 +134,12 @@ GEM
128
134
  metaclass (~> 0.0.1)
129
135
  mongo (1.10.0)
130
136
  bson (~> 1.10.0)
137
+ mongo (1.10.0-java)
138
+ bson (~> 1.10.0)
131
139
  multi_json (1.10.1)
132
140
  nokogiri (1.6.5)
133
141
  mini_portile (~> 0.6.0)
142
+ nokogiri (1.6.5-java)
134
143
  parslet (1.5.0)
135
144
  blankslate (~> 2.0)
136
145
  passenger (3.0.21)
@@ -138,10 +147,10 @@ GEM
138
147
  fastthread (>= 1.0.1)
139
148
  rack
140
149
  rake (>= 0.8.1)
141
- posix-spawn (0.3.9)
142
- pygments.rb (0.6.0)
150
+ posix-spawn (0.3.11)
151
+ pygments.rb (0.6.3)
143
152
  posix-spawn (~> 0.3.6)
144
- yajl-ruby (~> 1.1.0)
153
+ yajl-ruby (~> 1.2.0)
145
154
  rack (1.6.0)
146
155
  rack-test (0.6.3)
147
156
  rack (>= 1.0)
@@ -173,13 +182,13 @@ GEM
173
182
  rb-fsevent (0.9.4)
174
183
  rb-inotify (0.9.5)
175
184
  ffi (>= 0.5.0)
176
- redcarpet (3.2.2)
185
+ redcarpet (3.2.3)
177
186
  redis (3.2.0)
178
187
  redis-namespace (1.5.1)
179
188
  redis (~> 3.0, >= 3.0.4)
180
189
  rubystats (0.2.3)
181
190
  safe_yaml (1.0.4)
182
- sass (3.4.10)
191
+ sass (3.4.13)
183
192
  sprockets (2.12.3)
184
193
  hike (~> 1.2)
185
194
  multi_json (~> 1.0)
@@ -192,6 +201,7 @@ GEM
192
201
  sqlite3 (1.3.10)
193
202
  thor (0.19.1)
194
203
  thread_safe (0.3.4)
204
+ thread_safe (0.3.4-java)
195
205
  tilt (1.4.1)
196
206
  timecop (0.7.1)
197
207
  timers (4.0.1)
@@ -203,20 +213,23 @@ GEM
203
213
  webmock (1.20.4)
204
214
  addressable (>= 2.3.6)
205
215
  crack (>= 0.3.2)
206
- yajl-ruby (1.1.0)
216
+ yajl-ruby (1.2.1)
207
217
  yard (0.8.7.6)
208
218
 
209
219
  PLATFORMS
220
+ java
210
221
  ruby
211
222
 
212
223
  DEPENDENCIES
213
224
  RedCloth
214
- appraisal (>= 1.0.0.beta2)
225
+ activerecord-jdbc-adapter
226
+ appraisal (~> 1.0.2)
215
227
  bson_ext
216
228
  bundler (>= 1.0.0)
217
229
  fastthread!
218
230
  garb (< 0.9.2)
219
231
  integration (<= 0.1.0)
232
+ jdbc-sqlite3
220
233
  jekyll
221
234
  minitest (>= 4.2)
222
235
  mocha (~> 1.0)
@@ -228,7 +241,7 @@ DEPENDENCIES
228
241
  redis (>= 2.1)
229
242
  redis-namespace (>= 1.1.0)
230
243
  rubystats
231
- sqlite3
244
+ sqlite3 (~> 1.3.10)
232
245
  timecop
233
246
  vanity!
234
247
  webmock
@@ -59,22 +59,12 @@ module Vanity
59
59
  # alts = experiment(:background_color).alternatives
60
60
  # puts "#{alts.count} alternatives, with the colors: #{alts.map(&:value).join(", ")}"
61
61
  def alternatives(*args)
62
- @alternatives = args.empty? ? [true, false] : args.clone
63
- class << self
64
- define_method :alternatives, instance_method(:_alternatives)
62
+ @alternatives ||= args.empty? ? [true, false] : args.clone
63
+ @alternatives.each_with_index.map do |value, i|
64
+ Alternative.new(self, i, value)
65
65
  end
66
- nil
67
66
  end
68
67
 
69
- def _alternatives
70
- alts = []
71
- @alternatives.each_with_index do |value, i|
72
- alts << Alternative.new(self, i, value)
73
- end
74
- alts
75
- end
76
- private :_alternatives
77
-
78
68
  # Returns an Alternative with the specified value.
79
69
  #
80
70
  # @example
@@ -137,7 +127,7 @@ module Vanity
137
127
  if @playground.collecting?
138
128
  if active?
139
129
  identity = identity()
140
- index = connection.ab_showing(@id, identity)
130
+ index = connection.ab_showing(@id, identity) || connection.ab_assigned(@id, identity)
141
131
  unless index
142
132
  index = alternative_for(identity).to_i
143
133
  save_assignment_if_valid_visitor(identity, index, request) unless @playground.using_js?
@@ -151,6 +141,7 @@ module Vanity
151
141
  @showing[identity] ||= alternative_for(identity)
152
142
  index = @showing[identity]
153
143
  end
144
+
154
145
  alternatives[index.to_i]
155
146
  end
156
147
 
@@ -414,7 +405,7 @@ module Vanity
414
405
  def outcome
415
406
  return unless @playground.collecting?
416
407
  outcome = connection.ab_get_outcome(@id)
417
- outcome && _alternatives[outcome]
408
+ outcome && alternatives[outcome]
418
409
  end
419
410
 
420
411
  def complete!(outcome = nil)
@@ -445,7 +436,7 @@ module Vanity
445
436
  connection.destroy_experiment @id
446
437
  super
447
438
  end
448
-
439
+
449
440
  # clears all collected data for the experiment
450
441
  def reset
451
442
  connection.destroy_experiment @id
@@ -471,12 +462,12 @@ module Vanity
471
462
  # Called via a hook by the associated metric.
472
463
  def track!(metric_id, timestamp, count, *args)
473
464
  return unless active?
474
- identity = identity() rescue nil
475
- identity ||= args.last[:identity] if args.last.is_a?(Hash) && args.last[:identity]
465
+ identity = args.last[:identity] if args.last.is_a?(Hash)
466
+ identity ||= identity() rescue nil
476
467
  if identity
477
468
  return if connection.ab_showing(@id, identity)
478
469
  index = alternative_for(identity)
479
- connection.ab_add_conversion @id, index, identity, count
470
+ connection.ab_add_conversion(@id, index, identity, count)
480
471
  check_completion!
481
472
  end
482
473
  end
@@ -517,7 +508,8 @@ module Vanity
517
508
  return alternative.id if random_outcome < max_prob
518
509
  end
519
510
  end
520
- return Digest::MD5.hexdigest("#{name}/#{identity}").to_i(17) % @alternatives.size
511
+
512
+ Digest::MD5.hexdigest("#{name}/#{identity}").to_i(17) % @alternatives.size
521
513
  end
522
514
 
523
515
  # Saves the assignment of an alternative to a person and performs the
@@ -1,5 +1,5 @@
1
1
  module Vanity
2
- VERSION = "2.0.0.beta7"
2
+ VERSION = "2.0.0.beta8"
3
3
 
4
4
  module Version
5
5
  version = VERSION.to_s.split(".").map { |i| i.to_i }
data/test/cli_test.rb CHANGED
@@ -7,21 +7,23 @@ describe "bin/vanity" do
7
7
  end
8
8
 
9
9
  it "responds to version" do
10
- proc {
11
- IO.any_instance.expects(:puts)
12
- ARGV.clear
13
- ARGV << '--version'
14
- load "bin/vanity"
15
- }.must_raise SystemExit
10
+ assert_output(nil) do
11
+ proc {
12
+ ARGV.clear
13
+ ARGV << '--version'
14
+ load "bin/vanity"
15
+ }.must_raise SystemExit
16
+ end
16
17
  end
17
18
 
18
19
  it "responds to help" do
19
- proc {
20
- IO.any_instance.expects(:puts)
21
- ARGV.clear
22
- ARGV << '--help'
23
- load "bin/vanity"
24
- }.must_raise SystemExit
20
+ assert_output(nil) do
21
+ proc {
22
+ ARGV.clear
23
+ ARGV << '--help'
24
+ load "bin/vanity"
25
+ }.must_raise SystemExit
26
+ end
25
27
  end
26
28
 
27
29
  it "responds to list" do
@@ -47,4 +49,4 @@ describe "bin/vanity" do
47
49
  load "bin/vanity"
48
50
  end
49
51
  end
50
- end
52
+ end
@@ -118,6 +118,23 @@ class AbTestTest < ActionController::TestCase
118
118
  assert_equal 1, experiment(:abcd).alternatives.sum(&:conversions)
119
119
  end
120
120
 
121
+ # -- track! --
122
+
123
+ def test_track_with_identity_overrides_default
124
+ identities = ["quux"]
125
+ new_ab_test :foobar do
126
+ alternatives "foo", "bar"
127
+ identify { identities.pop || "6e98ec" }
128
+ metrics :coolness
129
+ end
130
+ 2.times { experiment(:foobar).choose }
131
+ assert_equal 0, experiment(:foobar).alternatives.sum(&:converted)
132
+ experiment(:foobar).track!(:coolness, Time.now, 1)
133
+ assert_equal 1, experiment(:foobar).alternatives.sum(&:converted)
134
+ experiment(:foobar).track!(:coolness, Time.now, 1, :identity=>"quux")
135
+ assert_equal 2, experiment(:foobar).alternatives.sum(&:converted)
136
+ end
137
+
121
138
  # -- use_js! --
122
139
 
123
140
  def test_choose_does_not_record_participant_when_using_js
@@ -327,6 +344,24 @@ class AbTestTest < ActionController::TestCase
327
344
  end
328
345
  end
329
346
 
347
+ def test_respects_out_of_band_assignment
348
+ new_ab_test :foobar do
349
+ alternatives "a", "b", "c"
350
+ identify { "6e98ec" }
351
+ metrics :coolness
352
+ end
353
+ # Note that this is explicitly not the alternative id that alternative_for
354
+ # would assign based on identity
355
+ assigned_alternative_id = 1
356
+ Vanity.playground.connection.ab_add_participant(
357
+ experiment(:foobar).id,
358
+ assigned_alternative_id,
359
+ "6e98ec"
360
+ )
361
+ chosen_alternative_id = experiment(:foobar).choose.id
362
+ assert_equal assigned_alternative_id, chosen_alternative_id
363
+ end
364
+
330
365
  def test_returns_different_alternatives_for_each_participant
331
366
  new_ab_test :foobar do
332
367
  alternatives "foo", "bar"
@@ -1021,7 +1056,7 @@ This experiment did not run long enough to find a clear winner.
1021
1056
  assert [:a, :b, :c].include?(choice)
1022
1057
  assert_equal choice, experiment(:simple).choose.value
1023
1058
  end
1024
-
1059
+
1025
1060
  def test_reset_clears_participants
1026
1061
  new_ab_test :simple do
1027
1062
  alternatives :a, :b, :c
@@ -1032,7 +1067,7 @@ This experiment did not run long enough to find a clear winner.
1032
1067
  experiment(:simple).reset
1033
1068
  assert_equal experiment(:simple).alternatives[1].participants, 0
1034
1069
  end
1035
-
1070
+
1036
1071
  def test_clears_outcome_and_completed_at
1037
1072
  new_ab_test :simple do
1038
1073
  alternatives :a, :b, :c
data/test/helper_test.rb CHANGED
@@ -8,10 +8,20 @@ describe Object do
8
8
  alternatives "foo", "bar"
9
9
  metrics :coolness
10
10
  end
11
- track! :coolness, :identity=>'quux', :values=>[2]
11
+ track!(:coolness, :identity=>'quux')
12
+
13
+ assert_equal 1, experiment(:foobar).alternatives.sum(&:conversions)
14
+ end
15
+
16
+ it "accepts value for conversion" do
17
+ metric "Coolness"
18
+ new_ab_test :foobar do
19
+ alternatives "foo", "bar"
20
+ metrics :coolness
21
+ end
22
+ track!(:coolness, :identity=>'quux', :values=>[2])
12
23
 
13
- # experiment(:foobar).alternatives.sum(&:conversions).must_equal 2
14
24
  assert_equal 2, experiment(:foobar).alternatives.sum(&:conversions)
15
25
  end
16
26
  end
17
- end
27
+ end
data/test/test_helper.rb CHANGED
@@ -20,12 +20,7 @@ require "rails/test_help"
20
20
 
21
21
  require "vanity"
22
22
  require "timecop"
23
-
24
- if defined?(Mocha::VERSION) && Mocha::VERSION < "0.13.0"
25
- require "mocha"
26
- else
27
- require "mocha/mini_test"
28
- end
23
+ require "mocha/mini_test"
29
24
  require "webmock/minitest"
30
25
 
31
26
  # Due to load order differences in Rails boot and test requires we have to
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vanity
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.beta7
4
+ version: 2.0.0.beta8
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-05-04 00:00:00.000000000 Z
12
+ date: 2015-07-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: i18n
@@ -205,7 +205,7 @@ licenses:
205
205
  post_install_message: To get started run vanity --help
206
206
  rdoc_options:
207
207
  - --title
208
- - Vanity 2.0.0.beta7
208
+ - Vanity 2.0.0.beta8
209
209
  - --main
210
210
  - README.rdoc
211
211
  - --webcvs