ab-split 1.0.0

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