vanity 2.0.1 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -2
  3. data/Appraisals +6 -6
  4. data/CHANGELOG +9 -3
  5. data/Gemfile.lock +1 -1
  6. data/README.md +299 -0
  7. data/doc/configuring.textile +8 -1
  8. data/doc/identity.textile +2 -0
  9. data/doc/metrics.textile +10 -0
  10. data/gemfiles/rails32.gemfile.lock +1 -1
  11. data/gemfiles/rails41.gemfile.lock +1 -1
  12. data/gemfiles/rails42.gemfile.lock +1 -1
  13. data/gemfiles/{rails4.gemfile → rails42_protected_attributes.gemfile} +2 -2
  14. data/gemfiles/rails42_protected_attributes.gemfile.lock +209 -0
  15. data/lib/generators/templates/vanity_migration.rb +1 -0
  16. data/lib/vanity/adapters/abstract_adapter.rb +11 -0
  17. data/lib/vanity/adapters/active_record_adapter.rb +15 -1
  18. data/lib/vanity/adapters/mock_adapter.rb +14 -0
  19. data/lib/vanity/adapters/mongodb_adapter.rb +14 -0
  20. data/lib/vanity/adapters/redis_adapter.rb +15 -0
  21. data/lib/vanity/configuration.rb +43 -11
  22. data/lib/vanity/experiment/ab_test.rb +145 -15
  23. data/lib/vanity/experiment/alternative.rb +4 -0
  24. data/lib/vanity/frameworks/rails.rb +69 -31
  25. data/lib/vanity/locales/vanity.en.yml +9 -0
  26. data/lib/vanity/locales/vanity.pt-BR.yml +4 -0
  27. data/lib/vanity/metric/active_record.rb +9 -1
  28. data/lib/vanity/templates/_ab_test.erb +9 -2
  29. data/lib/vanity/templates/_experiment.erb +21 -1
  30. data/lib/vanity/templates/vanity.css +11 -3
  31. data/lib/vanity/templates/vanity.js +35 -6
  32. data/lib/vanity/version.rb +1 -1
  33. data/test/commands/report_test.rb +1 -0
  34. data/test/dummy/config/application.rb +1 -0
  35. data/test/experiment/ab_test.rb +414 -0
  36. data/test/experiment/base_test.rb +16 -10
  37. data/test/frameworks/rails/action_controller_test.rb +14 -6
  38. data/test/frameworks/rails/action_mailer_test.rb +8 -6
  39. data/test/frameworks/rails/action_view_test.rb +1 -0
  40. data/test/helper_test.rb +2 -0
  41. data/test/metric/active_record_test.rb +56 -0
  42. data/test/playground_test.rb +3 -0
  43. data/test/test_helper.rb +28 -2
  44. data/test/web/rails/dashboard_test.rb +2 -0
  45. data/vanity.gemspec +2 -2
  46. metadata +8 -8
  47. data/README.rdoc +0 -231
  48. data/gemfiles/rails4.gemfile.lock +0 -179
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 99e7f2261835eee5e49f1a1286c134f5329586be
4
- data.tar.gz: 4de7123ddf75a32cd6228552e853db0228e29f85
3
+ metadata.gz: 785019e8d6f59f84073d7645a9b8a12c7c07edf0
4
+ data.tar.gz: 75b44173bbc79629b5c70d6bc545e3cdffb73962
5
5
  SHA512:
6
- metadata.gz: 4f2d1673cb4ee38a6ef9622d1413fcf404fb47f2acfe2fb115ba4f03c15586da19e86267ce76ef1a683e3e864cbb0b079a489850f0f5442146b05a83aea45e50
7
- data.tar.gz: f524dd7f7c260a4dc4c511d62aa9ae8b284525cae92afb7daf3f16fe09868e843817bf740438ceffdecbbbddefeed3a5ac884c94dff1493f78931c91f989a966
6
+ metadata.gz: a5b228f3a04a5f28db6a9c927b685c211340f3d6f4612e156d533683b35ede1089571c22119ff1db522259cb285948c63fba9d0c1b78ce9624f8c48b85ffb4ba
7
+ data.tar.gz: 1b337660bc064b51074dfd3979cfa32696b4a103d98ad1adac987e58376f613a8a384a8f58423a317a36b08ec94f39784688477053347281918f5278b19e5a52
data/.travis.yml CHANGED
@@ -11,7 +11,6 @@ services:
11
11
  - mongodb
12
12
  - redis-server
13
13
  rvm:
14
- - 1.9.3
15
14
  - 2.0.0
16
15
  - 2.1.0
17
16
  - 2.2.0
@@ -22,6 +21,6 @@ env:
22
21
  - DB=active_record
23
22
  gemfile:
24
23
  - gemfiles/rails32.gemfile
25
- - gemfiles/rails4.gemfile
26
24
  - gemfiles/rails41.gemfile
27
25
  - gemfiles/rails42.gemfile
26
+ - gemfiles/rails42_protected_attributes.gemfile
data/Appraisals CHANGED
@@ -7,22 +7,22 @@ appraise "rails32" do
7
7
  gem "passenger", "~>3.0"
8
8
  end
9
9
 
10
- appraise "rails4" do
10
+ appraise "rails41" do
11
11
  gem "mocha", "~> 1.0", :require=>false
12
- gem "rails", "4.0.13"
12
+ gem "rails", "4.1.9"
13
13
  gem "fastthread", :git => "git://github.com/zoltankiss/fastthread.git", :platforms => :mri_20
14
14
  gem "passenger", "~>3.0"
15
- gem 'test-unit'
16
15
  end
17
16
 
18
- appraise "rails41" do
17
+ appraise "rails42" do
19
18
  gem "mocha", "~> 1.0", :require=>false
20
- gem "rails", "4.1.9"
19
+ gem "rails", "4.2.0"
21
20
  gem "fastthread", :git => "git://github.com/zoltankiss/fastthread.git", :platforms => :mri_20
22
21
  gem "passenger", "~>3.0"
23
22
  end
24
23
 
25
- appraise "rails42" do
24
+ appraise "rails42-protected_attributes" do
25
+ gem "protected_attributes", "1.1.0"
26
26
  gem "mocha", "~> 1.0", :require=>false
27
27
  gem "rails", "4.2.0"
28
28
  gem "fastthread", :git => "git://github.com/zoltankiss/fastthread.git", :platforms => :mri_20
data/CHANGELOG CHANGED
@@ -1,6 +1,12 @@
1
- == 2.0.0 (2016-01-18)
2
-
3
- Add back deprecated connection key for vanity.yml. (@phillbaker)
1
+ == 2.1.0 (2015-1-19)
2
+
3
+ Add ability to define test alternatives with custom probabilities, #283. (@peterkovacs)
4
+ Allow ActiveRecord model metrics to provide their own identity source, #285. (@peterkovacs)
5
+ Add individual cookie options for name, domain, path, secure, and httponly properties of the cookie in the `Vanity.configuration`, #282. (@peterkovacs)
6
+ Update default_request_filter to exclude more bots, #284. (@peterkovacs)
7
+ Remove testing support for ruby 1.9.3. (@phillbaker)
8
+ Remove testing support for rails 4.0. (@phillbaker)
9
+ Add attr_accessible for VanityConversion model alternative attribute (@mikem836)
4
10
 
5
11
  == 2.0.0 (2015-12-14)
6
12
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- vanity (2.0.1)
4
+ vanity (2.1.0)
5
5
  i18n
6
6
 
7
7
  GEM
data/README.md ADDED
@@ -0,0 +1,299 @@
1
+ # Vanity
2
+ [![Build
3
+ Status](https://travis-ci.org/assaf/vanity.png?branch=master)](https://travis-ci.org/assaf/vanity)
4
+
5
+ Vanity is an A/B testing framework for Rails that is datastore agnostic.
6
+
7
+ * All about Vanity: http://vanity.labnotes.org
8
+ * On Github: http://github.com/assaf/vanity
9
+
10
+ [![Dashboard](doc/images/sidebar_test.png)](http://github.com/assaf/vanity)
11
+
12
+ ## A/B Testing With Rails
13
+
14
+ ### **Step 1:** Start using Vanity in your Rails application
15
+
16
+ #### Step 1.1
17
+
18
+ ##### Rails 3 & Rails 4 installation
19
+
20
+ Add to your Gemfile:
21
+
22
+ gem "vanity"
23
+
24
+ (For support for older versions of Rails and Ruby 1.8, please see the [1.9.x
25
+ branch](https://github.com/assaf/vanity/tree/1-9-stable).)
26
+
27
+ #### Step 1.2
28
+
29
+ Choose a datastore that best fits your needs and preferences for storing
30
+ experiment results. Choose one of: Redis, MongoDB or an SQL database. While
31
+ Redis is usually faster, it may add additional complexity to your stack.
32
+ Datastores should be configured using a `config/vanity.yml`.
33
+
34
+ ##### Redis Setup
35
+
36
+ Add to your Gemfile:
37
+
38
+ gem "redis", ">= 2.1"
39
+ gem "redis-namespace", ">= 1.1.0"
40
+
41
+ By default Vanity is configured to use Redis on localhost port 6379 with
42
+ database 0.
43
+
44
+ A sample `config/vanity.yml` might look like:
45
+
46
+ ```yaml
47
+ test:
48
+ collecting: false
49
+ production:
50
+ adapter: redis
51
+ url: redis://<%= ENV["REDIS_USER"] %>:<%= ENV["REDIS_PASSWORD"] %>@<%= ENV["REDIS_HOST"] %>:<%= ENV["REDIS_PORT"] %>/0
52
+ ```
53
+
54
+ If you want to use your test environment with RSpec you will need to add an
55
+ adapter to test:
56
+
57
+ ```yaml
58
+ test:
59
+ adapter: redis
60
+ collecting: false
61
+ ```
62
+
63
+ ##### MongoDB Setup
64
+
65
+ Add to your Gemfile:
66
+
67
+ ```ruby
68
+ gem "bson_ext"
69
+ gem "mongo"
70
+ ```
71
+
72
+ A sample `config/vanity.yml` might look like:
73
+
74
+ ```yaml
75
+ development:
76
+ adapter: mongodb
77
+ database: analytics
78
+ test:
79
+ collecting: false
80
+ production:
81
+ adapter: mongodb
82
+ database: analytics
83
+ ```
84
+
85
+ ##### SQL Database Setup
86
+
87
+ Vanity supports multiple SQL stores (like MySQL, MariaDB, Postgres, Sqlite,
88
+ etc.) using ActiveRecord, which is built into Rails. If you're using
89
+ DataMapper, Sequel or another persistence framework, add to your Gemfile:
90
+
91
+ ```ruby
92
+ gem "active_record"
93
+ ```
94
+
95
+ A sample `config/vanity.yml` might look like:
96
+
97
+ ```yaml
98
+ development:
99
+ adapter: active_record
100
+ active_record_adapter: sqlite3
101
+ database: db/development.sqlite3
102
+ test:
103
+ collecting: false
104
+ production:
105
+ adapter: active_record
106
+ active_record_adapter: default
107
+ ```
108
+
109
+ If you're going to store data in the database, run the generator and
110
+ migrations to create the database schema:
111
+
112
+ ```sh
113
+ $ rails generate vanity
114
+ $ rake db:migrate
115
+ ```
116
+
117
+ #### Step 1.3
118
+
119
+ Turn Vanity on, and pass a reference to a method that identifies a user. For
120
+ example:
121
+
122
+ ```ruby
123
+ class ApplicationController < ActionController::Base
124
+ use_vanity :current_user
125
+ end
126
+ ```
127
+
128
+ For more information, please see the [identity
129
+ documentation](http://vanity.labnotes.org/identity.html).
130
+
131
+ ### **Step 2:** Define your first A/B test
132
+
133
+ This experiment goes in the file `experiments/price_options.rb`:
134
+
135
+ ```ruby
136
+ ab_test "Price options" do
137
+ description "Mirror, mirror on the wall, who's the better price of all?"
138
+ alternatives 19, 25, 29
139
+ metrics :signups
140
+ end
141
+ ```
142
+
143
+ If the experiment uses a metric as above ("signups"), there needs to be a
144
+ corresponding ruby file for that metric, `experiments/metrics/signups.rb`.
145
+
146
+ ```ruby
147
+ metric "Signup (Activation)" do
148
+ description "Measures how many people signed up for our awesome service."
149
+ end
150
+ ```
151
+
152
+ ### **Step 3:** Present the different options to your users
153
+
154
+ ```erb
155
+ <h2>Get started for only $<%= ab_test :price_options %> a month!</h2>
156
+ ```
157
+
158
+ ### **Step 4:** Measure conversion
159
+
160
+ Conversions are created via the `Vanity.track!` method. For example:
161
+
162
+ ```ruby
163
+ class SignupController < ApplicationController
164
+ def signup
165
+ @account = Account.new(params[:account])
166
+ if @account.save
167
+ Vanity.track!(:signups)
168
+ redirect_to @acccount
169
+ else
170
+ render action: :offer
171
+ end
172
+ end
173
+ end
174
+ ```
175
+
176
+ ### **Step 5:** Check the report:
177
+
178
+ ```sh
179
+ vanity report --output vanity.html
180
+ ```
181
+
182
+ To view metrics and experiment results with the dashboard in Rails 3 & Rails
183
+ 4:
184
+
185
+ ```sh
186
+ rails generate controller Vanity --helper=false
187
+ ```
188
+
189
+ In `config/routes.rb`, add:
190
+
191
+ ```ruby
192
+ get '/vanity' =>'vanity#index'
193
+ get '/vanity/participant/:id' => 'vanity#participant'
194
+ post '/vanity/complete'
195
+ post '/vanity/chooses'
196
+ post '/vanity/reset'
197
+ post '/vanity/enable'
198
+ post '/vanity/disable'
199
+ post '/vanity/add_participant'
200
+ get '/vanity/image'
201
+ ```
202
+
203
+ The controller should look like:
204
+
205
+ ```ruby
206
+ class VanityController < ApplicationController
207
+ include Vanity::Rails::Dashboard
208
+ layout false # exclude this if you want to use your application layout
209
+ end
210
+ ```
211
+
212
+ ## Registering participants with Javascript
213
+
214
+ If robots or spiders make up a significant portion of your sites traffic they
215
+ can affect your conversion rate. Vanity can optionally add participants to the
216
+ experiments using asynchronous javascript callbacks, which will keep many
217
+ robots out. For those robots that do execute Javascript and are well-behaved
218
+ (like Googlebot), Vanity filters out requests based on their user-agent
219
+ string.
220
+
221
+ In Rails, add the following to `application.rb`:
222
+
223
+ ```ruby
224
+ Vanity.configure do |config|
225
+ config.use_js = true
226
+
227
+ # Optionally configure the add_participant route that is added with Vanity::Rails::Dashboard,
228
+ # make sure that this action does not require authentication
229
+ # config.add_participant_route = '/vanity/add_participant'
230
+ end
231
+ ```
232
+
233
+ Then add `<%= vanity_js %>` to any page that calls an A/B test **after calling
234
+ `ab_test`**. `vanity_js` needs to be included after your call to ab_test so
235
+ that it knows which version of the experiment the participant is a member of.
236
+ The helper will render nothing if the there are no ab_tests running on the
237
+ current page, so adding `vanity_js` to the bottom of your layouts is a good
238
+ option. Keep in mind that if you set `use_js` and don't include `vanity_js` in
239
+ your view no participants will be recorded.
240
+
241
+ ## Compatibility
242
+
243
+ Here's what's tested and known to work:
244
+
245
+ Ruby 2.0
246
+ Persistence: Redis, Mongo, ActiveRecord
247
+ Rails: 3.2, 4.1, 4.2
248
+ Ruby 2.1
249
+ Persistence: Redis, Mongo, ActiveRecord
250
+ Rails: 3.2, 4.1, 4.2
251
+ Ruby 2.2
252
+ Persistence: Redis, Mongo, ActiveRecord
253
+ Rails: 3.2, 4.1, 4.2
254
+
255
+ ## Testing
256
+
257
+ For view tests/specs or integration testing, it's handy to set the outcome of
258
+ an experiment. This may be done using the `chooses` method. For example:
259
+
260
+ ```ruby
261
+ Vanity.playground.experiment(:price_options).chooses(19)
262
+
263
+ ## Updating documentation
264
+
265
+ Documenation is written in the textile format in the [docs](docs/) directory,
266
+ and is hosted on Github Pages. To update the docs commit changes to the master
267
+ branch in this repository, then:
268
+
269
+ ```sh
270
+ bundle exec rake docs # output HTML files into html/
271
+ git checkout gh-pages
272
+ mv html/* . # Move generated html to the top of the repo
273
+ git commit # Add, commit and push any changes!
274
+ ```
275
+
276
+ Go ahead and target a pull request against the `gh-pages` branch.
277
+
278
+ ## Contributing
279
+
280
+ * Fork the project
281
+ * Please use a feature branch to make your changes, it's easier to test them
282
+ that way
283
+ * To set up the test suite run `bundle`, then run `appraisal install` to
284
+ prepare the test suite to run against multiple versions of Rails
285
+ * Fix, patch, enhance, document, improve, sprinkle pixie dust
286
+ * Tests. Please. Run `appraisal rake test`, of if you can, `rake test:all`.
287
+ (This project uses Travis CI where the test suite is run against multiple
288
+ versions of ruby, rails and backends.)
289
+ * Send a pull request on GitHub
290
+
291
+
292
+ ## Credits/License
293
+
294
+ Original code, copyright of Assaf Arkin, released under the MIT license.
295
+
296
+ Documentation available under the Creative Commons Attribution license.
297
+
298
+ For full list of credits and licenses:
299
+ http://vanity.labnotes.org/credits.html.
@@ -44,6 +44,13 @@ Available configuration options are:
44
44
  | request_filter | A proc that returns whether to to ignore the request for the add JS participant route | Ignore requests with a HTTP_USER_AGENT that contain a URL |
45
45
  | templates_path | Path to templates for Vanity admin | the templates in the gem |
46
46
  | use_js | Whether to use JS to add particpants, useful to ignore bots | false |
47
+ | experiments_start_enabled | Whether new experiments start in the enabled or disabled state | true |
48
+ | cookie_name | The name of the anonymous tracking cookie | @vanity_id@ |
49
+ | cookie_expires | The duration of the cookie | 20 years |
50
+ | cookie_domain | The domain for the cookie. Rails.application.config.session_options[:domain] will be substituted if @nil@. | @nil@ |
51
+ | cookie_path | The path of the cookie | @nil@ |
52
+ | cookie_secure | The secure (ssl-only) parameter of the cookie. | @false@ |
53
+ | cookie_httponly | The httponly parameter of the cookie | @false@ |
47
54
 
48
55
  When "running under Rails":rails.html, Vanity defaults to using the Rails logger, locates the load_path relative to Rails root, uses the @config/vanity.yml@ configuration file (if present) and turns collection on only in production mode.
49
56
 
@@ -68,4 +75,4 @@ config.after_initialize do
68
75
  require "garb"
69
76
  Garb::Session.login('..ga email..', '..ga pwd..', account_type: "GOOGLE")
70
77
  end
71
- </pre>
78
+ </pre>
data/doc/identity.textile CHANGED
@@ -31,6 +31,8 @@ end
31
31
 
32
32
  If you use either block or method name and they return @nil@, Vanity will fallback on persistent cookie mechanism.
33
33
 
34
+ Note that @current_user@ in this case must return @nil@ for non-persisted accounts. That is, @current_user.id@ *must* be non-@nil@.
35
+
34
36
  An identity can be anything. For example, if you're running an experiment to test a new feature that will be available in some projects but not others, you'll want to slice the audience by project identifier, not user ID.
35
37
 
36
38
  You can also give each experiment a different identity using the @identify@ callback. Here's an example that tells one experiment to use a project identifier:
data/doc/metrics.textile CHANGED
@@ -133,6 +133,16 @@ metric "Signups (Unlimited)" do
133
133
  end
134
134
  </pre>
135
135
 
136
+ The @model@ specifier can also take an @:identity@ option. @:identity:@ should be a @Proc@ that specifies how to fetch the identity of the experiment participant. This is useful when constructing objects outside the ActionController context (perhaps in a background task). However, note that your experiment participants may still be identified by their anonymous cookie identifier, if you started any experiments before the user was identifiable.
137
+
138
+ This example will record conversions for the Account to which the Subscription belongs:
139
+
140
+ <pre>
141
+ metric "Subscriptions finished on backend" do
142
+ description "These signups were actually created in a background task."
143
+ model Subscription, :identity => lambda { |record| record.account_id }
144
+ end
145
+ </pre>
136
146
 
137
147
  h3(#ga). Google Analytics
138
148
 
@@ -7,7 +7,7 @@ GIT
7
7
  PATH
8
8
  remote: ..
9
9
  specs:
10
- vanity (2.0.1)
10
+ vanity (2.1.0)
11
11
  i18n
12
12
 
13
13
  GEM
@@ -7,7 +7,7 @@ GIT
7
7
  PATH
8
8
  remote: .././
9
9
  specs:
10
- vanity (2.0.1)
10
+ vanity (2.1.0)
11
11
  i18n
12
12
 
13
13
  GEM
@@ -7,7 +7,7 @@ GIT
7
7
  PATH
8
8
  remote: ..
9
9
  specs:
10
- vanity (2.0.1)
10
+ vanity (2.1.0)
11
11
  i18n
12
12
 
13
13
  GEM
@@ -12,11 +12,11 @@ gem "garb", "< 0.9.2", :require => false
12
12
  gem "timecop", :require => false
13
13
  gem "webmock", :require => false
14
14
  gem "fakefs", :require => "fakefs/safe"
15
+ gem "protected_attributes", "1.1.0"
15
16
  gem "mocha", "~> 1.0", :require => false
16
- gem "rails", "4.0.13"
17
+ gem "rails", "4.2.0"
17
18
  gem "fastthread", :git => "git://github.com/zoltankiss/fastthread.git", :platforms => :mri_20
18
19
  gem "passenger", "~>3.0"
19
- gem "test-unit"
20
20
 
21
21
  group :development do
22
22
  gem "appraisal", "~> 1.0.2"
@@ -0,0 +1,209 @@
1
+ GIT
2
+ remote: git://github.com/zoltankiss/fastthread.git
3
+ revision: cefbca3009b9c68df5e473d840462ebcc7fa1504
4
+ specs:
5
+ fastthread (1.0.7)
6
+
7
+ PATH
8
+ remote: ../
9
+ specs:
10
+ vanity (2.1.0)
11
+ i18n
12
+
13
+ GEM
14
+ remote: https://rubygems.org/
15
+ specs:
16
+ RedCloth (4.2.9)
17
+ actionmailer (4.2.0)
18
+ actionpack (= 4.2.0)
19
+ actionview (= 4.2.0)
20
+ activejob (= 4.2.0)
21
+ mail (~> 2.5, >= 2.5.4)
22
+ rails-dom-testing (~> 1.0, >= 1.0.5)
23
+ actionpack (4.2.0)
24
+ actionview (= 4.2.0)
25
+ activesupport (= 4.2.0)
26
+ rack (~> 1.6.0)
27
+ rack-test (~> 0.6.2)
28
+ rails-dom-testing (~> 1.0, >= 1.0.5)
29
+ rails-html-sanitizer (~> 1.0, >= 1.0.1)
30
+ actionview (4.2.0)
31
+ activesupport (= 4.2.0)
32
+ builder (~> 3.1)
33
+ erubis (~> 2.7.0)
34
+ rails-dom-testing (~> 1.0, >= 1.0.5)
35
+ rails-html-sanitizer (~> 1.0, >= 1.0.1)
36
+ activejob (4.2.0)
37
+ activesupport (= 4.2.0)
38
+ globalid (>= 0.3.0)
39
+ activemodel (4.2.0)
40
+ activesupport (= 4.2.0)
41
+ builder (~> 3.1)
42
+ activerecord (4.2.0)
43
+ activemodel (= 4.2.0)
44
+ activesupport (= 4.2.0)
45
+ arel (~> 6.0)
46
+ activesupport (4.2.0)
47
+ i18n (~> 0.7)
48
+ json (~> 1.7, >= 1.7.7)
49
+ minitest (~> 5.1)
50
+ thread_safe (~> 0.3, >= 0.3.4)
51
+ tzinfo (~> 1.1)
52
+ addressable (2.3.8)
53
+ appraisal (1.0.3)
54
+ bundler
55
+ rake
56
+ thor (>= 0.14.0)
57
+ arel (6.0.3)
58
+ bson (1.12.5)
59
+ bson_ext (1.12.5)
60
+ bson (~> 1.12.5)
61
+ builder (3.2.2)
62
+ colorator (0.1)
63
+ concurrent-ruby (1.0.0)
64
+ crack (0.4.3)
65
+ safe_yaml (~> 1.0.0)
66
+ daemon_controller (1.2.0)
67
+ erubis (2.7.0)
68
+ fakefs (0.6.7)
69
+ ffi (1.9.10)
70
+ garb (0.9.1)
71
+ activesupport (>= 2.2.0)
72
+ crack (>= 0.1.6)
73
+ globalid (0.3.6)
74
+ activesupport (>= 4.1.0)
75
+ hashdiff (0.2.3)
76
+ i18n (0.7.0)
77
+ integration (0.1.0)
78
+ jekyll (3.0.1)
79
+ colorator (~> 0.1)
80
+ jekyll-sass-converter (~> 1.0)
81
+ jekyll-watch (~> 1.1)
82
+ kramdown (~> 1.3)
83
+ liquid (~> 3.0)
84
+ mercenary (~> 0.3.3)
85
+ rouge (~> 1.7)
86
+ safe_yaml (~> 1.0)
87
+ jekyll-sass-converter (1.4.0)
88
+ sass (~> 3.4)
89
+ jekyll-watch (1.3.0)
90
+ listen (~> 3.0)
91
+ json (1.8.3)
92
+ kramdown (1.9.0)
93
+ liquid (3.0.6)
94
+ listen (3.0.5)
95
+ rb-fsevent (>= 0.9.3)
96
+ rb-inotify (>= 0.9)
97
+ loofah (2.0.3)
98
+ nokogiri (>= 1.5.9)
99
+ mail (2.6.3)
100
+ mime-types (>= 1.16, < 3)
101
+ mercenary (0.3.5)
102
+ metaclass (0.0.4)
103
+ mime-types (2.99)
104
+ mini_portile2 (2.0.0)
105
+ minitest (5.8.3)
106
+ mocha (1.1.0)
107
+ metaclass (~> 0.0.1)
108
+ mongo (1.12.5)
109
+ bson (= 1.12.5)
110
+ nokogiri (1.6.7.1)
111
+ mini_portile2 (~> 2.0.0.rc2)
112
+ passenger (3.0.21)
113
+ daemon_controller (>= 1.0.0)
114
+ fastthread (>= 1.0.1)
115
+ rack
116
+ rake (>= 0.8.1)
117
+ protected_attributes (1.1.0)
118
+ activemodel (>= 4.0.1, < 5.0)
119
+ rack (1.6.4)
120
+ rack-test (0.6.3)
121
+ rack (>= 1.0)
122
+ rails (4.2.0)
123
+ actionmailer (= 4.2.0)
124
+ actionpack (= 4.2.0)
125
+ actionview (= 4.2.0)
126
+ activejob (= 4.2.0)
127
+ activemodel (= 4.2.0)
128
+ activerecord (= 4.2.0)
129
+ activesupport (= 4.2.0)
130
+ bundler (>= 1.3.0, < 2.0)
131
+ railties (= 4.2.0)
132
+ sprockets-rails
133
+ rails-deprecated_sanitizer (1.0.3)
134
+ activesupport (>= 4.2.0.alpha)
135
+ rails-dom-testing (1.0.7)
136
+ activesupport (>= 4.2.0.beta, < 5.0)
137
+ nokogiri (~> 1.6.0)
138
+ rails-deprecated_sanitizer (>= 1.0.1)
139
+ rails-html-sanitizer (1.0.2)
140
+ loofah (~> 2.0)
141
+ railties (4.2.0)
142
+ actionpack (= 4.2.0)
143
+ activesupport (= 4.2.0)
144
+ rake (>= 0.8.7)
145
+ thor (>= 0.18.1, < 2.0)
146
+ rake (10.4.2)
147
+ rb-fsevent (0.9.7)
148
+ rb-inotify (0.9.5)
149
+ ffi (>= 0.5.0)
150
+ redis (3.2.2)
151
+ redis-namespace (1.5.2)
152
+ redis (~> 3.0, >= 3.0.4)
153
+ rouge (1.10.1)
154
+ rubystats (0.2.3)
155
+ safe_yaml (1.0.4)
156
+ sass (3.4.20)
157
+ sprockets (3.5.2)
158
+ concurrent-ruby (~> 1.0)
159
+ rack (> 1, < 3)
160
+ sprockets-rails (3.0.0)
161
+ actionpack (>= 4.0)
162
+ activesupport (>= 4.0)
163
+ sprockets (>= 3.0.0)
164
+ sqlite3 (1.3.11)
165
+ thor (0.19.1)
166
+ thread_safe (0.3.5)
167
+ timecop (0.8.0)
168
+ tzinfo (1.2.2)
169
+ thread_safe (~> 0.1)
170
+ webmock (1.22.5)
171
+ addressable (< 2.4.0)
172
+ crack (>= 0.3.2)
173
+ hashdiff
174
+ yard (0.8.7.6)
175
+
176
+ PLATFORMS
177
+ ruby
178
+
179
+ DEPENDENCIES
180
+ RedCloth
181
+ activerecord-jdbc-adapter
182
+ appraisal (~> 1.0.2)
183
+ bson_ext
184
+ bundler (>= 1.0.0)
185
+ fakefs
186
+ fastthread!
187
+ garb (< 0.9.2)
188
+ integration (<= 0.1.0)
189
+ jdbc-sqlite3
190
+ jekyll
191
+ minitest (>= 4.2)
192
+ mocha (~> 1.0)
193
+ mongo
194
+ passenger (~> 3.0)
195
+ protected_attributes (= 1.1.0)
196
+ rack
197
+ rails (= 4.2.0)
198
+ rake
199
+ redis (>= 2.1)
200
+ redis-namespace (>= 1.1.0)
201
+ rubystats
202
+ sqlite3 (~> 1.3.10)
203
+ timecop
204
+ vanity!
205
+ webmock
206
+ yard
207
+
208
+ BUNDLED WITH
209
+ 1.11.2
@@ -17,6 +17,7 @@ class VanityMigration < ActiveRecord::Migration
17
17
  create_table :vanity_experiments do |t|
18
18
  t.string :experiment_id
19
19
  t.integer :outcome
20
+ t.boolean :enabled
20
21
  t.datetime :created_at
21
22
  t.datetime :completed_at
22
23
  end