vanity 2.0.0.beta7 → 2.0.0.beta8

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.
@@ -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