ab-split 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +30 -0
  3. data/.csslintrc +2 -0
  4. data/.eslintignore +1 -0
  5. data/.eslintrc +213 -0
  6. data/.github/FUNDING.yml +1 -0
  7. data/.github/ISSUE_TEMPLATE/bug_report.md +24 -0
  8. data/.rspec +1 -0
  9. data/.rubocop.yml +7 -0
  10. data/.rubocop_todo.yml +679 -0
  11. data/.travis.yml +60 -0
  12. data/Appraisals +19 -0
  13. data/CHANGELOG.md +696 -0
  14. data/CODE_OF_CONDUCT.md +74 -0
  15. data/CONTRIBUTING.md +62 -0
  16. data/Gemfile +7 -0
  17. data/LICENSE +22 -0
  18. data/README.md +955 -0
  19. data/Rakefile +9 -0
  20. data/ab-split.gemspec +44 -0
  21. data/gemfiles/4.2.gemfile +9 -0
  22. data/gemfiles/5.0.gemfile +9 -0
  23. data/gemfiles/5.1.gemfile +9 -0
  24. data/gemfiles/5.2.gemfile +9 -0
  25. data/gemfiles/6.0.gemfile +9 -0
  26. data/lib/split.rb +76 -0
  27. data/lib/split/algorithms/block_randomization.rb +23 -0
  28. data/lib/split/algorithms/weighted_sample.rb +18 -0
  29. data/lib/split/algorithms/whiplash.rb +38 -0
  30. data/lib/split/alternative.rb +191 -0
  31. data/lib/split/combined_experiments_helper.rb +37 -0
  32. data/lib/split/configuration.rb +255 -0
  33. data/lib/split/dashboard.rb +74 -0
  34. data/lib/split/dashboard/helpers.rb +45 -0
  35. data/lib/split/dashboard/pagination_helpers.rb +86 -0
  36. data/lib/split/dashboard/paginator.rb +16 -0
  37. data/lib/split/dashboard/public/dashboard-filtering.js +43 -0
  38. data/lib/split/dashboard/public/dashboard.js +24 -0
  39. data/lib/split/dashboard/public/jquery-1.11.1.min.js +4 -0
  40. data/lib/split/dashboard/public/reset.css +48 -0
  41. data/lib/split/dashboard/public/style.css +328 -0
  42. data/lib/split/dashboard/views/_controls.erb +18 -0
  43. data/lib/split/dashboard/views/_experiment.erb +155 -0
  44. data/lib/split/dashboard/views/_experiment_with_goal_header.erb +8 -0
  45. data/lib/split/dashboard/views/index.erb +26 -0
  46. data/lib/split/dashboard/views/layout.erb +27 -0
  47. data/lib/split/encapsulated_helper.rb +42 -0
  48. data/lib/split/engine.rb +15 -0
  49. data/lib/split/exceptions.rb +6 -0
  50. data/lib/split/experiment.rb +486 -0
  51. data/lib/split/experiment_catalog.rb +51 -0
  52. data/lib/split/extensions/string.rb +16 -0
  53. data/lib/split/goals_collection.rb +45 -0
  54. data/lib/split/helper.rb +165 -0
  55. data/lib/split/metric.rb +101 -0
  56. data/lib/split/persistence.rb +28 -0
  57. data/lib/split/persistence/cookie_adapter.rb +94 -0
  58. data/lib/split/persistence/dual_adapter.rb +85 -0
  59. data/lib/split/persistence/redis_adapter.rb +57 -0
  60. data/lib/split/persistence/session_adapter.rb +29 -0
  61. data/lib/split/redis_interface.rb +50 -0
  62. data/lib/split/trial.rb +117 -0
  63. data/lib/split/user.rb +69 -0
  64. data/lib/split/version.rb +7 -0
  65. data/lib/split/zscore.rb +57 -0
  66. data/spec/algorithms/block_randomization_spec.rb +32 -0
  67. data/spec/algorithms/weighted_sample_spec.rb +19 -0
  68. data/spec/algorithms/whiplash_spec.rb +24 -0
  69. data/spec/alternative_spec.rb +320 -0
  70. data/spec/combined_experiments_helper_spec.rb +57 -0
  71. data/spec/configuration_spec.rb +258 -0
  72. data/spec/dashboard/pagination_helpers_spec.rb +200 -0
  73. data/spec/dashboard/paginator_spec.rb +37 -0
  74. data/spec/dashboard_helpers_spec.rb +42 -0
  75. data/spec/dashboard_spec.rb +210 -0
  76. data/spec/encapsulated_helper_spec.rb +52 -0
  77. data/spec/experiment_catalog_spec.rb +53 -0
  78. data/spec/experiment_spec.rb +533 -0
  79. data/spec/goals_collection_spec.rb +80 -0
  80. data/spec/helper_spec.rb +1111 -0
  81. data/spec/metric_spec.rb +31 -0
  82. data/spec/persistence/cookie_adapter_spec.rb +106 -0
  83. data/spec/persistence/dual_adapter_spec.rb +194 -0
  84. data/spec/persistence/redis_adapter_spec.rb +90 -0
  85. data/spec/persistence/session_adapter_spec.rb +32 -0
  86. data/spec/persistence_spec.rb +34 -0
  87. data/spec/redis_interface_spec.rb +111 -0
  88. data/spec/spec_helper.rb +52 -0
  89. data/spec/split_spec.rb +43 -0
  90. data/spec/support/cookies_mock.rb +20 -0
  91. data/spec/trial_spec.rb +299 -0
  92. data/spec/user_spec.rb +87 -0
  93. metadata +322 -0
data/.travis.yml ADDED
@@ -0,0 +1,60 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0
5
+ - 2.1.10
6
+ - 2.2.2
7
+ - 2.3.8
8
+ - 2.4.9
9
+ - 2.5.7
10
+ - 2.6.5
11
+
12
+ gemfile:
13
+ - gemfiles/4.2.gemfile
14
+ - gemfiles/5.0.gemfile
15
+ - gemfiles/5.1.gemfile
16
+ - gemfiles/5.2.gemfile
17
+ - gemfiles/6.0.gemfile
18
+
19
+ matrix:
20
+ exclude:
21
+ - rvm: 1.9.3
22
+ gemfile: gemfiles/5.0.gemfile
23
+ - rvm: 1.9.3
24
+ gemfile: gemfiles/5.1.gemfile
25
+ - rvm: 1.9.3
26
+ gemfile: gemfiles/5.2.gemfile
27
+ - rvm: 1.9.3
28
+ gemfile: gemfiles/6.0.gemfile
29
+ - rvm: 2.0
30
+ gemfile: gemfiles/5.0.gemfile
31
+ - rvm: 2.0
32
+ gemfile: gemfiles/5.1.gemfile
33
+ - rvm: 2.0
34
+ gemfile: gemfiles/5.2.gemfile
35
+ - rvm: 2.0
36
+ gemfile: gemfiles/6.0.gemfile
37
+ - rvm: 2.1.10
38
+ gemfile: gemfiles/5.0.gemfile
39
+ - rvm: 2.1.10
40
+ gemfile: gemfiles/5.1.gemfile
41
+ - rvm: 2.1.10
42
+ gemfile: gemfiles/5.2.gemfile
43
+ - rvm: 2.1.10
44
+ gemfile: gemfiles/6.0.gemfile
45
+ - rvm: 2.2.2
46
+ gemfile: gemfiles/6.0.gemfile
47
+ - rvm: 2.3.8
48
+ gemfile: gemfiles/6.0.gemfile
49
+ - rvm: 2.4.9
50
+ gemfile: gemfiles/6.0.gemfile
51
+
52
+ before_install:
53
+ - gem uninstall -v '>= 2' -i $(rvm gemdir)@global -ax bundler || true
54
+ - gem install bundler --version=1.17.3
55
+
56
+ script:
57
+ - RAILS_ENV=test bundle exec rake spec && bundle exec codeclimate-test-reporter
58
+
59
+ cache: bundler
60
+ sudo: false
data/Appraisals ADDED
@@ -0,0 +1,19 @@
1
+ appraise "4.2" do
2
+ gem "rails", "~> 4.2"
3
+ end
4
+
5
+ appraise "5.0" do
6
+ gem "rails", "~> 5.0"
7
+ end
8
+
9
+ appraise "5.1" do
10
+ gem "rails", "~> 5.1"
11
+ end
12
+
13
+ appraise "5.2" do
14
+ gem "rails", "~> 5.2"
15
+ end
16
+
17
+ appraise "6.0" do
18
+ gem 'rails', '~> 6.0'
19
+ end
data/CHANGELOG.md ADDED
@@ -0,0 +1,696 @@
1
+ ## 3.4.1 (November 12th, 2019)
2
+
3
+ Bugfixes:
4
+ - Reference ActionController directly when including split helpers, to avoid breaking Rails API Controllers (@andrehjr, #602)
5
+
6
+ ## 3.4.0 (November 9th, 2019)
7
+
8
+ Features:
9
+ - Improve DualAdapter (@santib, #588), adds a new configuration for the DualAdapter, making it possible to keep consistency for logged_out/logged_in users. It's a opt-in flag. No Behavior was changed on this release.
10
+ - Make dashboard pagination default "per" param configurable (@alopatin, #597)
11
+
12
+ Bugfixes:
13
+ - Fix `force_alternative` for experiments with incremented version (@giraffate, #568)
14
+ - Persist alternative weights (@giraffate, #570)
15
+ - Combined experiment performance improvements (@gnanou, #575)
16
+ - Handle correctly case when ab_finished is called before ab_test for a user (@gnanou, #577)
17
+ - When loading active_experiments, it should not look into user's 'finished' keys (@andrehjr, #582)
18
+
19
+ Misc:
20
+ - Remove `rubyforge_project` from gemspec (@giraffate, #583)
21
+ - Fix URLs to replace http with https (@giraffate , #584)
22
+ - Lazily include split helpers in ActionController::Base (@hasghari, #586)
23
+ - Fix unused variable warnings (@andrehjr, #592)
24
+ - Fix ruby warnings (@andrehjr, #593)
25
+ - Update rubocop.yml config (@andrehjr, #594)
26
+ - Add frozen_string_literal to all files that were missing it (@andrehjr, #595)
27
+
28
+ ## 3.3.2 (April 12th, 2019)
29
+
30
+ Features:
31
+ - Added uptime robot to configuration.rb (@razel1982, #556)
32
+ - Check to see if being run in Rails application and run in before_initialize (@husteadrobert, #555)
33
+
34
+ Bugfixes:
35
+ - Fix error message interpolation (@hanibash, #553)
36
+ - Fix Bigdecimal warnings (@agraves, #551)
37
+ - Avoid hitting up on redis for robots/excluded users. (@andrehjr, #544)
38
+ - Checks for defined?(request) on Helper#exclude_visitor?. (@andrehjr)
39
+
40
+ Misc:
41
+ - Update travis to add Rails 6 (@edmilton, #559)
42
+ - Fix broken specs in developement environment (@dougpetronilio, #557)
43
+
44
+ ## 3.3.1 (January 11th, 2019)
45
+
46
+ Features:
47
+ - Filter some more bots (@janosch-x, #542)
48
+
49
+ Bugfixes:
50
+ - Fix Dashboard Pagination Helper typo (@cattekin, #541)
51
+ - Do not storage alternative in cookie if experiment has a winner (@sadhu89, #539)
52
+ - fix user participating alternative not found (@NaturalHokke, #536)
53
+
54
+ Misc:
55
+ - Tweak RSpec instructions (@eliotsykes, #540)
56
+ - Improve README regarding rspec usage (@vermaxik, #538)
57
+
58
+ ## 3.3.0 (August 13th, 2018)
59
+
60
+ Features:
61
+
62
+ - Added pagination for dashboard (@GeorgeGorbanev, #518)
63
+ - Add Facebot crawler to list of bots (@pfeiffer, #530)
64
+ - Ignore previewing requests (@pfeiffer, #531)
65
+ - Fix binding of ignore_filter (@pfeiffer, #533)
66
+
67
+ Bugfixes:
68
+
69
+ - Fix cookie header duplication (@andrehjr, #522)
70
+
71
+ Performance:
72
+
73
+ - Improve performance of RedisInterface#make_list_length by using LTRIM command (@mlovic, #509)
74
+
75
+ Misc:
76
+
77
+ - Update development dependencies
78
+ - test rails 5.2 on travis (@lostapathy, #524)
79
+ - update ruby versions for travis (@lostapathy, #525)
80
+
81
+ ## 3.2.0 (September 21st, 2017)
82
+
83
+ Features:
84
+
85
+ - Allow configuration of how often winning alternatives are recalculated (@patbl, #501)
86
+
87
+ Bugfixes:
88
+
89
+ - Avoid z_score numeric exception for conversion rates >1 (@cmantas, #503)
90
+ - Fix combined experiments (@semanticart, #502)
91
+
92
+ ## 3.1.1 (August 30th, 2017)
93
+
94
+ Bugfixes:
95
+
96
+ - Bring back support for ruby 1.9.3 and greater (rubygems 2.0.0 or greater now required) (@patbl, #498)
97
+
98
+ Misc:
99
+
100
+ - Document testing with RSpec (@eliotsykes, #495)
101
+
102
+ ## 3.1.0 (August 14th, 2017)
103
+
104
+ Features:
105
+
106
+ - Support for combined experiments (@daviddening, #493)
107
+ - Rewrite CookieAdapter to work with Rack::Request and Rack::Response directly (@andrehjr, #490)
108
+ - Enumeration of a User's Experiments that Respects the db_failover Option(@MarkRoddy, #487)
109
+
110
+ Bugfixes:
111
+
112
+ - Blocked a few more common bot user agents (@kylerippey, #485)
113
+
114
+ Misc:
115
+
116
+ - Repository Audit by Maintainer.io (@RichardLitt, #484)
117
+ - Update development dependencies
118
+ - Test on ruby 2.4.1
119
+ - Test compatibility with rails 5.1
120
+ - Add uris to metadata section in gemspec
121
+
122
+ ## 3.0.0 (March 30th, 2017)
123
+
124
+ Features:
125
+
126
+ - added block randomization algorithm and specs (@hulleywood, #475)
127
+ - Add ab_record_extra_info to allow record extra info to alternative and display on dashboard. (@tranngocsam, #460)
128
+
129
+ Bugfixes:
130
+
131
+ - Avoid crashing on Ruby 2.4 for numeric strings (@flori, #470)
132
+ - Fix issue where redis isn't required (@tomciopp , #466)
133
+
134
+ Misc:
135
+
136
+ - Avoid variable_size_secure_compare private method (@eliotsykes, #465)
137
+
138
+ ## 2.2.0 (November 11th, 2016)
139
+
140
+ **Backwards incompatible!** Redis keys are renamed. Please make sure all running tests are completed before you upgrade, as they will reset.
141
+
142
+ Features:
143
+
144
+ - Remove dependency on Redis::Namespace (@bschaeffer, #425)
145
+ - Make resetting on experiment change optional (@moggyboy, #430)
146
+ - Add ability to force alternative on dashboard (@ccallebs, #437)
147
+
148
+ Bugfixes:
149
+
150
+ - Fix variations reset across page loads for multiple=control and improve coverage (@Vasfed, #432)
151
+
152
+ Misc:
153
+
154
+ - Remove Explicit Return (@BradHudson, #441)
155
+ - Update Redis config docs (@bschaeffer, #422)
156
+ - Harden HTTP Basic snippet against timing attacks (@eliotsykes, #443)
157
+ - Removed a couple old ruby 1.8 hacks (@andrew, #456)
158
+ - Run tests on rails 5 (@andrew, #457)
159
+ - Fixed a few codeclimate warnings (@andrew, #458)
160
+ - Use codeclimate for test coverage (@andrew #455)
161
+
162
+ ## 2.1.0 (August 8th, 2016)
163
+
164
+ Features:
165
+
166
+ - Support REDIS_PROVIDER variable used in Heroku (@kartikluke, #426)
167
+
168
+ ## 2.0.0 (July 17th, 2016)
169
+
170
+ Breaking changes:
171
+
172
+ - Removed deprecated `finished` and `begin_experiment` methods
173
+ - Namespaced override param to avoid potential clashes (@henrik, #398)
174
+
175
+ ## 1.7.0 (June 28th, 2016)
176
+
177
+ Features:
178
+
179
+ - Running concurrent experiments on same endpoint/view (@karmakaze, #421)
180
+
181
+ ## 1.6.0 (June 16th, 2016)
182
+
183
+ Features:
184
+
185
+ - Add Dual Redis(logged-in)/cookie(logged-out) persistence adapter (@karmakaze, #420)
186
+
187
+ ## 1.5.0 (June 8th, 2016)
188
+
189
+ Features:
190
+
191
+ - Add `expire_seconds:` TTL option to RedisAdapter (@karmakaze, #409)
192
+ - Optional custom persistence adapter (@ndelage, #411)
193
+
194
+ Misc:
195
+
196
+ - Use fakeredis for testing (@andrew, #412)
197
+
198
+ ## 1.4.5 (June 7th, 2016)
199
+
200
+ Bugfixes:
201
+
202
+ - FIX Negative numbers on non-finished (@divineforest, #408)
203
+ - Eliminate extra RedisAdapter hget (@karmakaze, #407)
204
+ - Remove unecessary code from Experiment class (@pakallis, #391, #392, #393)
205
+
206
+ Misc:
207
+
208
+ - Simplify Configuration#normalized_experiments (@pakallis, #395)
209
+ - Clarify test running instructions (@henrik, #397)
210
+
211
+ ## 1.4.4 (May 9th, 2016)
212
+
213
+ Bugfixes:
214
+
215
+ - Increment participation if store override is true and no experiment key exists (@spheric, #380)
216
+
217
+ Misc:
218
+
219
+ - Deprecated `finished` method in favour of `ab_finished` (@andreibondarev, #389)
220
+ - Added minimum version requirement to simple-random
221
+ - Clarify finished with first option being a hash in Readme (@henrik, #382)
222
+ - Refactoring the User abstraction (@andreibondarev, #384)
223
+
224
+ ## 1.4.3 (April 28th, 2016)
225
+
226
+ Features:
227
+
228
+ - add on_trial callback whenever a trial is started (@mtyeh411, #375)
229
+
230
+ Bugfixes:
231
+
232
+ - Allow algorithm configuration at experiment level (@007sumit, #376)
233
+
234
+ Misc:
235
+
236
+ - only choose override if it exists as valid alternative (@spheric, #377)
237
+
238
+ ## 1.4.2 (April 25th, 2016)
239
+
240
+ Misc:
241
+
242
+ - Deprecated some legacy methods (@andreibondarev, #374)
243
+
244
+ ## 1.4.1 (April 21st, 2016)
245
+
246
+ Bugfixes:
247
+
248
+ - respect manual start configuration after an experiment has been deleted (@mtyeh411, #372)
249
+
250
+ Misc:
251
+
252
+ - Introduce goals collection to reduce complexity of Experiment#save (@pakallis, #365)
253
+ - Revise specs according to http://betterspecs.org/ (@hkliya, #369)
254
+
255
+ ## 1.4.0 (April 2nd, 2016)
256
+
257
+ Features:
258
+
259
+ - Added experiment filters to dashboard (@ccallebs, #363, #364)
260
+ - Added Contributor Covenant Code of Conduct
261
+
262
+ ## 1.3.2 (January 2nd, 2016)
263
+
264
+ Bugfixes:
265
+
266
+ - Fix deleting experiments in from the updated dashboard (@craigmcnamara, #352)
267
+
268
+ ## 1.3.1 (January 1st, 2016)
269
+
270
+ Bugfixes:
271
+
272
+ - Fix the dashboard for experiments with ‘/‘ in the name. (@craigmcnamara, #349)
273
+
274
+ ## 1.3.0 (October 20th, 2015)
275
+
276
+ Features:
277
+
278
+ - allow for custom redis_url different from ENV variable (@davidgrieser, #323)
279
+ - add ability to change the length of the persistence cookie (@peterylai, #335)
280
+
281
+ Bugfixes:
282
+
283
+ - Rescue from Redis::BaseError instead of Redis::CannotConnectError (@nfm, #342)
284
+ - Fix active experiments when experiment is on a later version (@ndrisso, #331)
285
+ - Fix caching of winning alternative (@nfm, #329)
286
+
287
+ Misc:
288
+
289
+ - Remove duplication from Experiment#save (@pakallis, #333)
290
+ - Remove unnecessary argument from Experiment#write_to_alternative (@t4deu, #332)
291
+
292
+ ## 1.2.1 (May 17th, 2015)
293
+
294
+ Features:
295
+
296
+ - Handle redis DNS resolution failures gracefully (@fusion2004, #310)
297
+ - Push metadata to ab_test block (@ekorneeff, #296)
298
+ - Helper methods are now private when included in controllers (@ipoval, #303)
299
+
300
+ Bugfixes:
301
+
302
+ - Return an empty hash as metadata when Split is disabled (@tomasdundacek, #313)
303
+ - Don't use capture helper from ActionView (@tomasdundacek, #312)
304
+
305
+ Misc:
306
+
307
+ - Remove body "max-width" from dashboard (@xicreative, #299)
308
+ - fix private for class methods (@ipoval, #301)
309
+ - minor memoization fix in spec (@ipoval, #304)
310
+ - Minor documentation fixes (#295, #297, #305, #308)
311
+
312
+ ## 1.2.0 (January 24th, 2015)
313
+
314
+ Features:
315
+
316
+ - Configure redis using environment variables if available (@saratovsource , #293)
317
+ - Store metadata on experiment configuration (@dekz, #291)
318
+
319
+ Bugfixes:
320
+
321
+ - Revert the Trial#complete! public API to support noargs (@dekz, #292)
322
+
323
+ ## 1.1.0 (January 9th, 2015)
324
+
325
+ Changes:
326
+
327
+ - Public class methods on `Split::Experiment` (e.g., `find_or_create`)
328
+ have been moved to `Split::ExperimentCatalog`.
329
+
330
+ Features:
331
+
332
+ - Decouple trial from Split::Helper (@joshdover, #286)
333
+ - Helper method for Active Experiments (@blahblahblah-, #273)
334
+
335
+ Misc:
336
+
337
+ - Use the new travis container based infrastructure for tests (@andrew, #280)
338
+
339
+ ## 1.0.0 (October 12th, 2014)
340
+
341
+ Changes:
342
+
343
+ - Remove support for Ruby 1.8.7 and Rails 2.3 (@qpowell, #271)
344
+
345
+ ## 0.8.0 (September 25th, 2014)
346
+
347
+ Features:
348
+
349
+ - Added new way to calculate the probability an alternative is the winner (@caser, #266, #251)
350
+ - support multiple metrics per experiment (@stevenou, #260)
351
+
352
+ Bugfixes:
353
+
354
+ - Avoiding call to params in EncapsulatedHelper (@afn, #257)
355
+
356
+ ## 0.7.3 (September 16th, 2014)
357
+
358
+ Features:
359
+
360
+ - Disable all split tests via a URL parameter (@hwartig, #263)
361
+
362
+ Bugfixes:
363
+
364
+ - Correctly escape experiment names on dashboard (@ecaron, #265)
365
+ - Handle redis connection exception error properly (@andrew, #245)
366
+
367
+ ## 0.7.2 (June 12th, 2014)
368
+
369
+ Features:
370
+
371
+ - Show metrics on the dashboard (@swrobel, #241)
372
+
373
+ Bugfixes:
374
+
375
+ - Avoid nil error with ExperimentCatalog when upgrading (@danielschwartz, #253)
376
+ - [SECURITY ISSUE] Only allow known alternatives as query param overrides (@ankane, #255)
377
+
378
+ ## 0.7.1 (March 20th, 2014)
379
+
380
+ Features:
381
+
382
+ - You can now reopen experiment from the dashboard (@mikezaby, #235)
383
+
384
+ Misc:
385
+
386
+ - Internal code tidy up (@IanVaughan, #238)
387
+
388
+ ## 0.7.0 (December 26th, 2013)
389
+
390
+ Features:
391
+
392
+ - Significantly improved z-score algorithm (@caser ,#221)
393
+ - Better sorting of Experiments on dashboard (@wadako111, #218)
394
+
395
+ Bugfixes:
396
+
397
+ - Fixed start button not being displayed in some cases (@vigosan, #219)
398
+
399
+ Misc:
400
+
401
+ - Experiment#initialize refactoring (@nberger, #224)
402
+ - Extract ExperimentStore into a seperate class (@nberger, #225)
403
+
404
+ ## 0.6.6 (October 15th, 2013)
405
+
406
+ Features:
407
+
408
+ - Sort experiments on Dashboard so "active" ones without a winner appear first (@swrobel, #204)
409
+ - Starting tests manually (@duksis, #209)
410
+
411
+ Bugfixes:
412
+
413
+ - Only trigger completion callback with valid Trial (@segfaultAX, #208)
414
+ - Fixed bug with `resettable` when using `normalize_experiments` (@jonashuckestein, #213)
415
+
416
+ Misc:
417
+
418
+ - Added more bots to filter list (@lbeder, #214, #215, #216)
419
+
420
+ ## 0.6.5 (August 23, 2013)
421
+
422
+ Features:
423
+
424
+ - Added Redis adapter for persisting experiments across sessions (@fengb, #203)
425
+
426
+ Misc:
427
+
428
+ - Expand upon algorithms section in README (@swrobel, #200)
429
+
430
+ ## 0.6.4 (August 8, 2013)
431
+
432
+ Features:
433
+
434
+ - Add hooks for experiment deletion and resetting (@craigmcnamara, #198)
435
+ - Allow Split::Helper to be used outside of a controller (@nfm, #190)
436
+ - Show current Rails/Rack Env in dashboard (@rceee, #187)
437
+
438
+ Bugfixes:
439
+
440
+ - Fix whiplash algorithm when using goals (@swrobel, #193)
441
+
442
+ Misc:
443
+
444
+ - Refactor dashboard js (@buddhamagnet)
445
+
446
+ ## 0.6.3 (July 8, 2013)
447
+
448
+ Features:
449
+
450
+ - Add hooks for Trial#choose! and Trial#complete! (@bmarini, #176)
451
+
452
+ Bugfixes:
453
+
454
+ - Stores and parses Experiment's start_time as a UNIX integer (@joeroot, #177)
455
+
456
+ ## 0.6.2 (June 6, 2013)
457
+
458
+ Features:
459
+
460
+ - Rails 2.3 compatibility (@bhcarpenter, #167)
461
+ - Adding possibility to store overridden alternative (@duksis, #173)
462
+
463
+ Misc:
464
+
465
+ - Now testing against multiple versions of rails
466
+
467
+ ## 0.6.1 (May 4, 2013)
468
+
469
+ Bugfixes:
470
+
471
+ - Use the specified algorithm for the experiment instead of the default (@woodhull, #165)
472
+
473
+ Misc:
474
+
475
+ - Ensure experiements are valid when configuring (@ashmckenzie, #159)
476
+ - Allow arrays to be passed to ab_test (@fenelon, #156)
477
+
478
+ ## 0.6.0 (April 4, 2013)
479
+
480
+ Features:
481
+
482
+ - Support for Ruby 2.0.0 (@phoet, #142)
483
+ - Multiple Goals (@liujin, #109)
484
+ - Ignoring IPs using Regular Expressions (@waynemoore, #119)
485
+ - Added ability to add more bots to the default list (@themgt, #140)
486
+ - Allow custom configuration of user blocking logic (@phoet , #148)
487
+
488
+ Bugfixes:
489
+
490
+ - Fixed regression in handling of config files (@iangreenleaf, #115)
491
+ - Fixed completion rate increases for experiments users aren't participating in (@philnash, #67)
492
+ - Handle exceptions from invalid JSON in cookies (@iangreenleaf, #126)
493
+
494
+ Misc:
495
+
496
+ - updated minimum json version requirement
497
+ - Refactor Yaml Configuration (@rtwomey, #124)
498
+ - Refactoring of Experiments (@iangreenleaf @tamird, #117 #118)
499
+ - Added more known Bots, including Pingdom, Bing, YandexBot (@julesie, @zinkkrysty, @dimko)
500
+ - Improved Readme (@iangreenleaf @phoet)
501
+
502
+ ## 0.5.0 (January 28, 2013)
503
+
504
+ Features:
505
+
506
+ - Persistence Adapters: Cookies and Session (@patbenatar, #98)
507
+ - Configure experiments from a hash (@iangreenleaf, #97)
508
+ - Pluggable sampling algorithms (@woodhull, #105)
509
+
510
+ Bugfixes:
511
+
512
+ - Fixed negative number of non-finished rates (@philnash, #83)
513
+ - Fixed behaviour of finished(:reset => false) (@philnash, #88)
514
+ - Only take into consideration positive z-scores (@thomasmaas, #96)
515
+ - Amended ab_test method to raise ArgumentError if passed integers or symbols as
516
+ alternatives (@buddhamagnet, #81)
517
+
518
+ ## 0.4.6 (October 28, 2012)
519
+
520
+ Features:
521
+
522
+ - General code quality improvements (@buddhamagnet, #79)
523
+
524
+ Bugfixes:
525
+
526
+ - Don't increment the experiment counter if user has finished (@dimko, #78)
527
+ - Fixed an incorrect test (@jaywengrow, #74)
528
+
529
+ ## 0.4.5 (August 30, 2012)
530
+
531
+ Bugfixes:
532
+
533
+ - Fixed header gradient in FF/Opera (@philnash, #69)
534
+ - Fixed reseting of experiment in session (@apsoto, #43)
535
+
536
+ ## 0.4.4 (August 9, 2012)
537
+
538
+ Features:
539
+
540
+ - Allow parameter overrides, even without Redis. (@bhcarpenter, #62)
541
+
542
+ Bugfixes:
543
+
544
+ - Fixes version number always increasing when alternatives are changed (@philnash, #63)
545
+ - updated guard-rspec to version 1.2
546
+
547
+ ## 0.4.3 (July 8, 2012)
548
+
549
+ Features:
550
+
551
+ - redis failover now recovers from all redis-related exceptions
552
+
553
+ ## 0.4.2 (June 1, 2012)
554
+
555
+ Features:
556
+
557
+ - Now works with v3.0 of redis gem
558
+
559
+ Bugfixes:
560
+
561
+ - Fixed redis failover on Rubinius
562
+
563
+ ## 0.4.1 (April 6, 2012)
564
+
565
+ Features:
566
+
567
+ - Added configuration option to disable Split testing (@ilyakatz, #45)
568
+
569
+ Bugfixes:
570
+
571
+ - Fix weights for existing experiments (@andreas, #40)
572
+ - Fixed dashboard range error (@andrew, #42)
573
+
574
+ ## 0.4.0 (March 7, 2012)
575
+
576
+ **IMPORTANT**
577
+
578
+ If using ruby 1.8.x and weighted alternatives you should always pass the control alternative through as the second argument with any other alternatives as a third argument because the order of the hash is not preserved in ruby 1.8, ruby 1.9 users are not affected by this bug.
579
+
580
+ Features:
581
+
582
+ - Experiments now record when they were started (@vrish88, #35)
583
+ - Old versions of experiments in sessions are now cleaned up
584
+ - Avoid users participating in multiple experiments at once (#21)
585
+
586
+ Bugfixes:
587
+
588
+ - Overriding alternatives doesn't work for weighted alternatives (@layflags, #34)
589
+ - confidence_level helper should handle tiny z-scores (#23)
590
+
591
+ ## 0.3.3 (February 16, 2012)
592
+
593
+ Bugfixes:
594
+
595
+ - Fixed redis failover when a block was passed to ab_test (@layflags, #33)
596
+
597
+ ## 0.3.2 (February 12, 2012)
598
+
599
+ Features:
600
+
601
+ - Handle redis errors gracefully (@layflags, #32)
602
+
603
+ ## 0.3.1 (November 19, 2011)
604
+
605
+ Features:
606
+
607
+ - General code tidy up (@ryanlecompte, #22, @mocoso, #28)
608
+ - Lazy loading data from Redis (@lautis, #25)
609
+
610
+ Bugfixes:
611
+
612
+ - Handle unstarted experiments (@mocoso, #27)
613
+ - Relaxed Sinatra version requirement (@martinclu, #24)
614
+
615
+
616
+ ## 0.3.0 (October 9, 2011)
617
+
618
+ Features:
619
+
620
+ - Redesigned dashboard (@mrappleton, #17)
621
+ - Use atomic increments in redis for better concurrency (@lautis, #18)
622
+ - Weighted alternatives
623
+
624
+ Bugfixes:
625
+
626
+ - Fix to allow overriding of experiments that aren't on version 1
627
+
628
+
629
+ ## 0.2.4 (July 18, 2011)
630
+
631
+ Features:
632
+
633
+ - Added option to finished to not reset the users session
634
+
635
+ Bugfixes:
636
+
637
+ - Only allow strings as alternatives, fixes strange errors when passing true/false or symbols
638
+
639
+ ## 0.2.3 (June 26, 2011)
640
+
641
+ Features:
642
+
643
+ - Experiments can now be deleted from the dashboard
644
+ - ab_test helper now accepts a block
645
+ - Improved dashboard
646
+
647
+ Bugfixes:
648
+
649
+ - After resetting an experiment, existing users of that experiment will also be reset
650
+
651
+ ## 0.2.2 (June 11, 2011)
652
+
653
+ Features:
654
+
655
+ - Updated redis-namespace requirement to 1.0.3
656
+ - Added a configuration object for changing options
657
+ - Robot regex can now be changed via a configuration options
658
+ - Added ability to ignore visits from specified IP addresses
659
+ - Dashboard now shows percentage improvement of alternatives compared to the control
660
+ - If the alternatives of an experiment are changed it resets the experiment and uses the new alternatives
661
+
662
+ Bugfixes:
663
+
664
+ - Saving an experiment multiple times no longer creates duplicate alternatives
665
+
666
+ ## 0.2.1 (May 29, 2011)
667
+
668
+ Bugfixes:
669
+
670
+ - Convert legacy sets to lists to avoid exceptions during upgrades from 0.1.x
671
+
672
+ ## 0.2.0 (May 29, 2011)
673
+
674
+ Features:
675
+
676
+ - Override an alternative via a url parameter
677
+ - Experiments can now be reset from the dashboard
678
+ - The first alternative is now considered the control
679
+ - General dashboard usability improvements
680
+ - Robots are ignored and given the control alternative
681
+
682
+ Bugfixes:
683
+
684
+ - Alternatives are now store in a list rather than a set to ensure consistent ordering
685
+ - Fixed diving by zero errors
686
+
687
+ ## 0.1.1 (May 18, 2011)
688
+
689
+ Bugfixes:
690
+
691
+ - More Robust conversion rate display on dashboard
692
+ - Ensure `Split::Version` is available everywhere, fixed dashboard
693
+
694
+ ## 0.1.0 (May 17, 2011)
695
+
696
+ Initial Release