yacc-vanity 1.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +243 -0
- data/Gemfile +24 -0
- data/MIT-LICENSE +21 -0
- data/README.rdoc +74 -0
- data/Rakefile +189 -0
- data/bin/vanity +69 -0
- data/lib/vanity.rb +36 -0
- data/lib/vanity/adapters/abstract_adapter.rb +135 -0
- data/lib/vanity/adapters/active_record_adapter.rb +304 -0
- data/lib/vanity/adapters/mock_adapter.rb +157 -0
- data/lib/vanity/adapters/mongodb_adapter.rb +162 -0
- data/lib/vanity/adapters/redis_adapter.rb +154 -0
- data/lib/vanity/backport.rb +26 -0
- data/lib/vanity/commands/list.rb +21 -0
- data/lib/vanity/commands/report.rb +64 -0
- data/lib/vanity/commands/upgrade.rb +34 -0
- data/lib/vanity/experiment/ab_test.rb +482 -0
- data/lib/vanity/experiment/base.rb +212 -0
- data/lib/vanity/frameworks/rails.rb +245 -0
- data/lib/vanity/helpers.rb +59 -0
- data/lib/vanity/metric/active_record.rb +83 -0
- data/lib/vanity/metric/base.rb +244 -0
- data/lib/vanity/metric/google_analytics.rb +83 -0
- data/lib/vanity/metric/remote.rb +53 -0
- data/lib/vanity/playground.rb +332 -0
- data/lib/vanity/templates/_ab_test.erb +26 -0
- data/lib/vanity/templates/_experiment.erb +5 -0
- data/lib/vanity/templates/_experiments.erb +7 -0
- data/lib/vanity/templates/_metric.erb +14 -0
- data/lib/vanity/templates/_metrics.erb +13 -0
- data/lib/vanity/templates/_report.erb +27 -0
- data/lib/vanity/templates/flot.min.js +1 -0
- data/lib/vanity/templates/jquery.min.js +19 -0
- data/lib/vanity/templates/vanity.css +26 -0
- data/lib/vanity/templates/vanity.js +82 -0
- data/lib/vanity/version.rb +11 -0
- data/test/experiment/ab_test.rb +700 -0
- data/test/experiment/base_test.rb +136 -0
- data/test/experiments/age_and_zipcode.rb +19 -0
- data/test/experiments/metrics/cheers.rb +3 -0
- data/test/experiments/metrics/signups.rb +2 -0
- data/test/experiments/metrics/yawns.rb +3 -0
- data/test/experiments/null_abc.rb +5 -0
- data/test/metric/active_record_test.rb +249 -0
- data/test/metric/base_test.rb +293 -0
- data/test/metric/google_analytics_test.rb +104 -0
- data/test/metric/remote_test.rb +108 -0
- data/test/myapp/app/controllers/application_controller.rb +2 -0
- data/test/myapp/app/controllers/main_controller.rb +7 -0
- data/test/myapp/config/boot.rb +110 -0
- data/test/myapp/config/environment.rb +10 -0
- data/test/myapp/config/environments/production.rb +0 -0
- data/test/myapp/config/routes.rb +3 -0
- data/test/passenger_test.rb +43 -0
- data/test/playground_test.rb +10 -0
- data/test/rails_test.rb +294 -0
- data/test/test_helper.rb +134 -0
- data/vanity.gemspec +25 -0
- metadata +161 -0
data/CHANGELOG
ADDED
@@ -0,0 +1,243 @@
|
|
1
|
+
== 1.5.1 (2010-12-20)
|
2
|
+
|
3
|
+
Fixes some minor bugs in RoR when including the Dashboard (netguru)
|
4
|
+
|
5
|
+
|
6
|
+
== 1.5.0 (2010-10-23)
|
7
|
+
|
8
|
+
Note: MongoDB URI scheme changed from mongo: to mongodb: to be consistent with
|
9
|
+
the rest of the civilized world. If you get an error because Vanity can't find
|
10
|
+
the MongoDB adapter, fear not! It's still there, just need to update your
|
11
|
+
config/vanity.yml file.
|
12
|
+
|
13
|
+
|
14
|
+
Rails 3 support (Adam Keys, Stephen Celis, Brian Leonard, Ryan Carver)
|
15
|
+
|
16
|
+
Changed MongoDB URI scheme from 'mongo://' to the standard 'mongodb://' and
|
17
|
+
renamed the mongodb adapter filename to make it match (JS Boulanger)
|
18
|
+
|
19
|
+
Added support for ERB in YAML configuration files (JS Boulanger)
|
20
|
+
|
21
|
+
Fixed initialization of playground's Rails defaults such that they can be
|
22
|
+
overriden in the environment (JS Boulanger)
|
23
|
+
|
24
|
+
|
25
|
+
== 1.4.0 (2010-08-06)
|
26
|
+
|
27
|
+
Note: Run this command to upgrade your database to 1.4, or you will not have
|
28
|
+
access to collected metrics and experiment data:
|
29
|
+
|
30
|
+
vanity upgrade
|
31
|
+
|
32
|
+
|
33
|
+
Connection adapters! We have a new way for managing connections which extends
|
34
|
+
to multiple adapters (not just Redis). The easiest is to use the configuration
|
35
|
+
file config/vanity.yml. For example:
|
36
|
+
|
37
|
+
development:
|
38
|
+
adapter: redis
|
39
|
+
production:
|
40
|
+
adapter: mongodb
|
41
|
+
|
42
|
+
We get to keep Redis, add new MongoDB adapter, but lose Mock. It's still there,
|
43
|
+
but there's a new way to use Vanity outside production: you can turn data
|
44
|
+
collection on/off.
|
45
|
+
|
46
|
+
Under Rails, data collection is turned off in all environments except
|
47
|
+
production. To turn if on/off:
|
48
|
+
|
49
|
+
Vanity.playground.collecting = true/false.
|
50
|
+
|
51
|
+
|
52
|
+
This release switches to latest Redis gem and uses redis-namespace (what took
|
53
|
+
me so long?) If your own code relies on the Redis gem, watch out: there are
|
54
|
+
some subtle incompatibilities between 1.x and 2.x.
|
55
|
+
|
56
|
+
|
57
|
+
Now using RVM, gemsets and Bundler to test Vanity in different configurations.
|
58
|
+
To run the full set of tests in all the supported versions of Ruby:
|
59
|
+
rake test:rubies
|
60
|
+
To test specific version of Ruby:
|
61
|
+
rake test:rubies[1.8.7]
|
62
|
+
To switch around:
|
63
|
+
rvm 1.9.2@vanity
|
64
|
+
|
65
|
+
* Added: Adapter API, see Vanity::Adapters::AbstractAdapter and
|
66
|
+
Vanity::Adapters::RedisAdapter.
|
67
|
+
* Added: MongoDB support.
|
68
|
+
* Added: Upgrade command.
|
69
|
+
* Added: Metric.last_update_at.
|
70
|
+
* Added: Vanity.playground.collecting. You want this to be true only in
|
71
|
+
production environment. When false, disables collecting of metric and
|
72
|
+
experiment data.
|
73
|
+
* Added: Remote metrics. Push data to remote service.
|
74
|
+
* Added: Partial support for multi-series metrics. Laying the ground for the
|
75
|
+
future.
|
76
|
+
* Change: Vanity.playground.redis and redis= methods are deprecated, use
|
77
|
+
connection and establish_connection instead.
|
78
|
+
* Removed: Metric.created_at, derived from experiment and never used.
|
79
|
+
|
80
|
+
|
81
|
+
== 1.3.0 (2010-03-01)
|
82
|
+
|
83
|
+
This release adds support for Google Analytics, AdWords and forking servers
|
84
|
+
(Passenger, Unicorn).
|
85
|
+
|
86
|
+
To view Google Analytics metrics from within Vanity, first make sure you are
|
87
|
+
using Garb. For example, in your Gemfile:
|
88
|
+
|
89
|
+
gem "vanity", "1.3.0"
|
90
|
+
gem "garb", "0.5.0"
|
91
|
+
|
92
|
+
Next, authenticate using your account credentials. For example, in your
|
93
|
+
config/environments/production.rb:
|
94
|
+
|
95
|
+
require "garb"
|
96
|
+
Garb::Session.login('..email..', '..password..', account_type: "GOOGLE") rescue nil
|
97
|
+
|
98
|
+
Last, define Vanity metrics that tap to Google Analytics metrics. For example:
|
99
|
+
|
100
|
+
metric "Acquisition: Visitors" do
|
101
|
+
description "Unique visitors on any given page, as tracked by Google Analytics"
|
102
|
+
google_analytics "UA-1828623-6", :visitors
|
103
|
+
end
|
104
|
+
|
105
|
+
* Added: Support for Google Analytics metrics, thanks to Tony Pitale's Garb and blog post: http://www.viget.com/extend/user-goal-tracking-in-rails-with-vanity-and-google-analytics/
|
106
|
+
* Added: Vanity query parameter that you can use to choose a particular alternative, e.g. to tie an advertisement banner with content of the site.
|
107
|
+
* Added: Command line "vanity list" catalogs all ongoing experiments, their alternatives (and fingerprints) and all metrics.
|
108
|
+
* Added: Playground.reconnect!, particularly useful when forking (Passenger, Unicorn, etc).
|
109
|
+
* Added: Vanity loads Redis configuration from config/redis.yml (if you have such a file).
|
110
|
+
* Changed: New way to specify connection configuration: Vanity.playground.redis = "localhost:6379". Use this instead of the separate host/port/db attribute.
|
111
|
+
* Changed: Rails integration now separates use_vanity method, filters and helpers.
|
112
|
+
* Changed: Explicit vanity_context_filter and vanity_reload_filter so you can skip them, or order filters relative to them.
|
113
|
+
* Fixed: If metric cannot be loaded (e.g. offline, no db access) show error message for that metric but don't break dashboard.
|
114
|
+
* Fixed: AbTest incorrectly calls identify method instead of identity (issue #2)
|
115
|
+
* Fixed: Running vanity command, automatically detects and loads Rails.
|
116
|
+
* Fixed: Vanity now picks up on load_path set from within config/environment.rb.
|
117
|
+
* Removed: Vanity.playground.define is deprecated. Bad choice for a method name. If you need this feature, make a suggestion and let's create a better API.
|
118
|
+
|
119
|
+
== 1.2.0 (2009-12-14)
|
120
|
+
This release introduces metrics backed by ActiveRecord. Use them when your model is already tracking a metric, and you get instant historical data.
|
121
|
+
|
122
|
+
Example, track sign ups using User model:
|
123
|
+
|
124
|
+
metric "Signups" do
|
125
|
+
model Account
|
126
|
+
end
|
127
|
+
|
128
|
+
Example, track satisfaction using Survey model:
|
129
|
+
metric "Satisfaction" do
|
130
|
+
model Survey, :average=>:rating
|
131
|
+
end
|
132
|
+
|
133
|
+
Example, track only high ratings:
|
134
|
+
metric "High ratings" do
|
135
|
+
model Rating, :conditions=>["stars >= 4"]
|
136
|
+
end
|
137
|
+
|
138
|
+
There's no need to call track! on these metrics.
|
139
|
+
|
140
|
+
* Added: Metrics backed by ActiveRecord.
|
141
|
+
* Added: track! and ab_test methods now available from Object (i.e. everywhere).
|
142
|
+
* Added: Playground.load!. Now loading all metrics and experiments from Rails initializer.
|
143
|
+
* Changed: Decoupled metric name from identifier. You can now define a metric with more descriptive name, e.g. "Cheers per second (user satisfaction)" and keep their ID simple. Identifier is matched against the file name (for metrics loaded from experiments/metrics).
|
144
|
+
* Changed: Metrics no longer defined on-demand, i.e. calling playground.metric either returns existing metric or raises exception.
|
145
|
+
* Changed: Playground.experiments returns hash instead of array.
|
146
|
+
* Changed: All dates in report are UTC, since we don't know which locale to use.
|
147
|
+
* Removed: Object.experiment is deprecated, please call Vanity.playground.experiment directly.
|
148
|
+
* Fixed: Playground no longer changes logging level on supplied logger.
|
149
|
+
|
150
|
+
== 1.1.1 (2009-12-4)
|
151
|
+
* Fixed: Binding issue that shows up on 1.8.6/7.
|
152
|
+
|
153
|
+
== 1.1.0 (2009-12-4)
|
154
|
+
This release introduces metrics. Metrics are the gateway drug to better software.
|
155
|
+
|
156
|
+
It’s as simple as defining a metric:
|
157
|
+
|
158
|
+
metric "Cheers" do
|
159
|
+
description "They love us, don't they?"
|
160
|
+
end
|
161
|
+
|
162
|
+
Tracking it from your code:
|
163
|
+
|
164
|
+
track! :cheers
|
165
|
+
|
166
|
+
And watching the graph from the Dashboard.
|
167
|
+
|
168
|
+
You can (should) also use metrics with your A/B tests, for example:
|
169
|
+
|
170
|
+
ab_test "Pricing options" do
|
171
|
+
metrics :signup
|
172
|
+
alternatives 15, 25, 29
|
173
|
+
end
|
174
|
+
|
175
|
+
This new usage may become requirement in a future release.
|
176
|
+
|
177
|
+
Much thanks to Ian Sefferman for fixing issues with Ruby 1.8.7 and Rails support.
|
178
|
+
|
179
|
+
* Added: Metrics.
|
180
|
+
* Added: Use Vanity.playground.mock! when running tests and you'd rather not access a live Redis server.
|
181
|
+
* Changed: A/B tests now using metrics for tracking.
|
182
|
+
* Changed: Now throwing NameError instead of LoadError when failing to load experiment/metric. NameError can be rescued on same line.
|
183
|
+
* Changed: New, easier URL mapping for Dashboard: map.vanity "/vanity", :controller=>:vanity.
|
184
|
+
* Changed: All tests are green on Ruby 1.8.6, 1.8.7 and 1.9.1.
|
185
|
+
* Changed: Switched to redis-rb from http://github.com/ezmobius/redis-rb.
|
186
|
+
* Deprecated: Please call experiment method with experiment identifier (a symbol) and not experiment name.
|
187
|
+
|
188
|
+
== 1.0.0 (2009-11-19)
|
189
|
+
This release changes the way you define a new experiment. You can use a method suitable for the type of experiment you want to define, or call the generic define method (previously: experiment method). For example:
|
190
|
+
|
191
|
+
ab_test "My A/B test" do
|
192
|
+
alternatives :a, :b
|
193
|
+
end
|
194
|
+
|
195
|
+
The experiment method is no longer overloaded: it looks up an experiment (loading its definition if necessary), but does not define an experiment. The ab_test method is overloaded, though this may change in the future.
|
196
|
+
|
197
|
+
In addition, the ab_goal! method is now track!. This method may be used for other tests in the future.
|
198
|
+
|
199
|
+
* Added: A/B test report now showing number of participants.
|
200
|
+
* Added: AbTest.score method accepts minimum probability (default 90), and
|
201
|
+
* Removed: Experiment.reset! method. Destroy and save have the same effect.
|
202
|
+
* Changed: Playground.define now requires an experiment type, ab_test is not the default any more.
|
203
|
+
* Changed: When you run Vanity in development mode (configuration.cache_classes = false), it will reload experiments on each request. You can also Vanity.playground.reload!.
|
204
|
+
* Changed: Fancy AJAX trickery in Rails console.
|
205
|
+
* Changed: You can break long experiment descriptions into multiple paragraphs using two consecutive newlines.
|
206
|
+
* Changed: AbTest confidence becomes probability; only returns choice alternative with probability equal or higher than that.
|
207
|
+
* Changed: ab_goal! becomes track!.
|
208
|
+
* Changed: Console becomes Dashboard, which is less confusing with rails console (script/console).
|
209
|
+
|
210
|
+
== 0.3.1 (2009-11-13)
|
211
|
+
* Changed: Redis 1.0 is now vendored into Vanity. This means one less dependecy ... actually two, since Redis brings with it RSpec.
|
212
|
+
|
213
|
+
== 0.3.0 (2009-11-13)
|
214
|
+
* Added: score now includes least performing alternatives, names and values.
|
215
|
+
* Added: shiny reports.
|
216
|
+
* Added: Rails console shows current experiments status and also allows you to choose which alternative you want to see.
|
217
|
+
* Changed: letters instead of numbers for options (option 1 => option A).
|
218
|
+
* Changed: experiment.alternatives is now an immutable snapshot.
|
219
|
+
* Changed: experiment.score returns populated alternative objects instead of structs.
|
220
|
+
* Changed: experiment.chooses uses Redis to store state, better for (when we get to) browser integration.
|
221
|
+
* Changed: experiment.chooses skips recording participant or conversion.
|
222
|
+
* Changed: to MIT license.
|
223
|
+
|
224
|
+
== 0.2.2 (2009-11-12)
|
225
|
+
* Added: vanity binary, with single command for generating a report.
|
226
|
+
* Added: return alternative by value from experiment.alternative(val) method.
|
227
|
+
* Added: reset an experiment by calling reset!.
|
228
|
+
* Added: experiment alternative name (option 1, option 2, etc).
|
229
|
+
* Added: new scoring algorithm: use experiment.score instead of alternative.z_score/confidence.
|
230
|
+
* Added: experiment.conclusion for plain English results.
|
231
|
+
|
232
|
+
== 0.2.1 (2009-11-11)
|
233
|
+
* Added: z-score and confidence level for A/B test alternatives.
|
234
|
+
* Added: test auto-completion and auto-outcome (complete_it, outcome_is).
|
235
|
+
* Changed: default alternatives are now false/true, so if can't decide outcome, fall back on false.
|
236
|
+
|
237
|
+
== 0.2.0 (2009-11-10)
|
238
|
+
* Added: experiment method on object, used to define and access experiments.
|
239
|
+
* Added: playground configuration (Vanity.playground.namespace = , etc).
|
240
|
+
* Added: use_vanity now accepts block instead of symbol.
|
241
|
+
* Changed: Vanity::Helpers becomes Vanity::Rails.
|
242
|
+
* Changed: A/B test experiments alternatives now handled using Alternatives object.
|
243
|
+
* Removed: A/B test measure method no longer in use.
|
data/Gemfile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
source :rubygems
|
2
|
+
gemspec
|
3
|
+
|
4
|
+
group :development do
|
5
|
+
gem "jekyll"
|
6
|
+
gem "rake"
|
7
|
+
gem "RedCloth"
|
8
|
+
gem "yard"
|
9
|
+
end
|
10
|
+
|
11
|
+
group :test do
|
12
|
+
gem "bson_ext"
|
13
|
+
gem "garb"
|
14
|
+
gem "mocha"
|
15
|
+
gem "mongo"
|
16
|
+
gem "passenger"
|
17
|
+
gem "rails", "2.3.8"
|
18
|
+
gem "rack", "1.1.0"
|
19
|
+
gem "shoulda"
|
20
|
+
gem "sqlite3-ruby", "1.2.5" # 1.3.0 doesn't like Ruby 1.9.1
|
21
|
+
gem "timecop"
|
22
|
+
#gem "SystemTimer"
|
23
|
+
gem "webmock"
|
24
|
+
end
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
Copyright (c) 2010 Assaf Arkin
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
data/README.rdoc
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
Vanity is an Experiment Driven Development framework for Rails.
|
2
|
+
|
3
|
+
* All about Vanity: http://vanity.labnotes.org
|
4
|
+
* On github: http://github.com/assaf/vanity
|
5
|
+
|
6
|
+
http://farm3.static.flickr.com/2540/4099665871_497f274f68_o.jpg
|
7
|
+
|
8
|
+
|
9
|
+
== A/B Testing With Rails (In 5 Easy Steps)
|
10
|
+
|
11
|
+
<b>Step 1:</b> Start using Vanity in your Rails application:
|
12
|
+
|
13
|
+
Rails::Initializer.run do |config|
|
14
|
+
gem.config "vanity"
|
15
|
+
|
16
|
+
config.after_initialize do
|
17
|
+
require "vanity"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
And:
|
22
|
+
|
23
|
+
class ApplicationController < ActionController::Base
|
24
|
+
use_vanity :current_user
|
25
|
+
end
|
26
|
+
|
27
|
+
<b>Step 2:</b> Define your first A/B test. This experiment goes in the file <code>experiments/price_options.rb</code>:
|
28
|
+
|
29
|
+
ab_test "Price options" do
|
30
|
+
description "Mirror, mirror on the wall, who's the better price of all?"
|
31
|
+
alternatives 19, 25, 29
|
32
|
+
metrics :signups
|
33
|
+
end
|
34
|
+
|
35
|
+
<b>Step 3:</b> Present the different options to your users:
|
36
|
+
|
37
|
+
<h2>Get started for only $<%= ab_test :price_options %> a month!</h2>
|
38
|
+
|
39
|
+
<b>Step 4:</b> Measure conversion:
|
40
|
+
|
41
|
+
class SignupController < ApplicationController
|
42
|
+
def signup
|
43
|
+
@account = Account.new(params[:account])
|
44
|
+
if @account.save
|
45
|
+
track! :signups
|
46
|
+
redirect_to @acccount
|
47
|
+
else
|
48
|
+
render action: :offer
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
<b>Step 5:</b> Check the report:
|
54
|
+
|
55
|
+
vanity report --output vanity.html
|
56
|
+
|
57
|
+
|
58
|
+
== Contributing
|
59
|
+
|
60
|
+
* Fork the project
|
61
|
+
* Please use a topic branch to make your changes, it's easier to test them that way
|
62
|
+
* Fix, patch, enhance, document, improve, sprinkle pixie dust
|
63
|
+
* At minimum run rake test, if possible, please run rake test:all
|
64
|
+
* Tests. Please. Run rake test, of if you can, rake test:all
|
65
|
+
* Send a pull request on GitHub
|
66
|
+
|
67
|
+
|
68
|
+
== Credits/License
|
69
|
+
|
70
|
+
Original code, copyright of Assaf Arkin, released under the MIT license.
|
71
|
+
|
72
|
+
Documentation available under the Creative Commons Attribution license.
|
73
|
+
|
74
|
+
For full list of credits and licenses: http://vanity.labnotes.org/credits.html.
|
data/Rakefile
ADDED
@@ -0,0 +1,189 @@
|
|
1
|
+
require "rake/testtask"
|
2
|
+
|
3
|
+
# -- Building stuff --
|
4
|
+
|
5
|
+
spec = Gem::Specification.load(Dir["*.gemspec"].first)
|
6
|
+
|
7
|
+
desc "Build the Gem"
|
8
|
+
task :build do
|
9
|
+
sh "gem build #{spec.name}.gemspec"
|
10
|
+
end
|
11
|
+
|
12
|
+
desc "Install #{spec.name} locally"
|
13
|
+
task :install=>:build do
|
14
|
+
sudo = "sudo" unless File.writable?( Gem::ConfigMap[:bindir])
|
15
|
+
sh "#{sudo} gem install #{spec.name}-#{spec.version}.gem"
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "Push new release to gemcutter and git tag"
|
19
|
+
task :push=>["test:all", "build"] do
|
20
|
+
sh "git push"
|
21
|
+
puts "Tagging version #{spec.version} .."
|
22
|
+
sh "git tag v#{spec.version}"
|
23
|
+
sh "git push --tag"
|
24
|
+
puts "Building and pushing gem .."
|
25
|
+
sh "gem push #{spec.name}-#{spec.version}.gem"
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
# -- Testing stuff --
|
30
|
+
|
31
|
+
desc "Test everything"
|
32
|
+
task "test:all"=>"test:rubies"
|
33
|
+
|
34
|
+
# Ruby versions we're testing with.
|
35
|
+
RUBIES = %w{1.8.7 1.9.2}
|
36
|
+
|
37
|
+
# Use rake test:rubies to run all combination of tests (see test:adapters) using
|
38
|
+
# all the versions of Ruby specified in RUBIES. Or to test a specific version of
|
39
|
+
# Ruby, rake test:rubies[1.8.7].
|
40
|
+
#
|
41
|
+
# This task uses RVM to install all the Ruby versions it needs, and creates a
|
42
|
+
# vanity gemset in each one that includes Bundler and all the gems specified in
|
43
|
+
# Gemfile. If anything goes south you can always wipe these gemsets or uninstall
|
44
|
+
# these Rubies and start over.
|
45
|
+
desc "Test using multiple versions of Ruby"
|
46
|
+
task "test:rubies", :ruby do |t, args|
|
47
|
+
rubies = args.ruby ? [args.ruby] : RUBIES
|
48
|
+
rubies.each do |ruby|
|
49
|
+
puts "** Setup #{ruby}"
|
50
|
+
sh "env rvm_install_on_use_flag=1 rvm_gemset_create_on_use_flag=1 rvm use #{ruby}@vanity"
|
51
|
+
sh "rvm #{ruby}@vanity rake test:setup"
|
52
|
+
puts
|
53
|
+
puts "** Test using #{ruby}"
|
54
|
+
sh "rvm #{ruby}@vanity -S bundle exec rake test:adapters #{'--trace' if Rake.application.options.trace}"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
task "test:setup" do
|
59
|
+
# Intended to be used from test:rubies, within specific RVM context.
|
60
|
+
begin # Make sure we got Bundler installed.
|
61
|
+
require "bundler"
|
62
|
+
rescue LoadError
|
63
|
+
sh "gem install bundler"
|
64
|
+
end
|
65
|
+
begin # Make sure we got all the dependencies
|
66
|
+
sh "bundle exec ruby -e puts > /dev/null"
|
67
|
+
rescue
|
68
|
+
sh "bundle install"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# These are all the adapters we're going to test with.
|
73
|
+
ADAPTERS = %w{redis mongodb}
|
74
|
+
|
75
|
+
desc "Test using different back-ends"
|
76
|
+
task "test:adapters", :adapter do |t, args|
|
77
|
+
adapters = args.adapter ? [args.adapter] : ADAPTERS
|
78
|
+
adapters.each do |adapter|
|
79
|
+
puts "** Testing #{adapter} adapter"
|
80
|
+
sh "rake test ADAPTER=#{adapter} #{'--trace' if Rake.application.options.trace}"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Run the test suit.
|
85
|
+
|
86
|
+
task :default=>:test
|
87
|
+
desc "Run all tests"
|
88
|
+
Rake::TestTask.new do |task|
|
89
|
+
task.test_files = FileList['test/**/*_test.rb']
|
90
|
+
if Rake.application.options.trace
|
91
|
+
#task.warning = true
|
92
|
+
task.verbose = true
|
93
|
+
elsif Rake.application.options.silent
|
94
|
+
task.ruby_opts << "-W0"
|
95
|
+
else
|
96
|
+
task.verbose = true
|
97
|
+
end
|
98
|
+
task.ruby_opts << "-I."
|
99
|
+
end
|
100
|
+
|
101
|
+
task(:clobber) { rm_rf "tmp" }
|
102
|
+
|
103
|
+
|
104
|
+
# -- Documenting stuff --
|
105
|
+
|
106
|
+
begin
|
107
|
+
require "yard"
|
108
|
+
YARD::Rake::YardocTask.new(:yardoc) do |task|
|
109
|
+
task.files = FileList["lib/**/*.rb"].exclude("lib/vanity/backport.rb")
|
110
|
+
task.options = "--output", "html/api", "--title", "Vanity #{spec.version}", "--main", "README.rdoc", "--files", "CHANGELOG"
|
111
|
+
end
|
112
|
+
rescue LoadError
|
113
|
+
end
|
114
|
+
|
115
|
+
desc "Jekyll generates the main documentation (sans API)"
|
116
|
+
task(:jekyll) { sh "jekyll", "doc", "html" }
|
117
|
+
file "html/vanity.pdf"=>:jekyll do |t|
|
118
|
+
pages = %w{index metrics ab_testing rails identity configuring contributing}.map{ |p| "html/#{p}.html" }
|
119
|
+
args = %w{--disable-javascript --outline --title Vanity --header-html doc/_layouts/_header.html --print-media-type}
|
120
|
+
args.concat %w{--margin-left 20 --margin-right 20 --margin-top 20 --margin-bottom 20 --header-spacing 5}
|
121
|
+
args.concat pages << t.name
|
122
|
+
sh "wkhtmltopdf", *args
|
123
|
+
end
|
124
|
+
|
125
|
+
file "html/vanity-api.zip"=>:yardoc do |t|
|
126
|
+
Dir.chdir "html" do
|
127
|
+
sh "zip vanity-api.zip -r api"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
desc "Create documentation in docs directory (including API)"
|
131
|
+
task :docs=>[:jekyll, :yardoc, "html/vanity-api.zip", "html/vanity.pdf"]
|
132
|
+
desc "Remove temporary files and directories"
|
133
|
+
task(:clobber) { rm_rf "html" ; rm_rf ".yardoc" }
|
134
|
+
|
135
|
+
desc "Publish documentation to vanity.labnotes.org"
|
136
|
+
task :publish=>[:clobber, :docs] do
|
137
|
+
sh "rsync -cr --del --progress html/ labnotes.org:/var/www/vanity/"
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
# -- Misc --
|
142
|
+
|
143
|
+
task :report do
|
144
|
+
$LOAD_PATH.unshift "lib"
|
145
|
+
require "vanity"
|
146
|
+
require "timecop"
|
147
|
+
Vanity.playground.load_path = "test/experiments"
|
148
|
+
Vanity.playground.experiments.values.each(&:destroy)
|
149
|
+
Vanity.playground.metrics.values.each(&:destroy!)
|
150
|
+
Vanity.playground.reload!
|
151
|
+
|
152
|
+
# Control 182 35 19.23% N/A
|
153
|
+
# Treatment A 180 45 25.00% 1.33
|
154
|
+
# Treatment B 189 28 14.81% -1.13
|
155
|
+
# Treatment C 188 61 32.45% 2.94
|
156
|
+
Vanity.playground.experiment(:null_abc).instance_eval do
|
157
|
+
fake nil=>[182,35], :red=>[180,45], :green=>[189,28], :blue=>[188,61]
|
158
|
+
@created_at = (Date.today - 40).to_time
|
159
|
+
@completed_at = (Date.today - 35).to_time
|
160
|
+
end
|
161
|
+
|
162
|
+
Vanity.playground.experiment(:age_and_zipcode).instance_eval do
|
163
|
+
fake false=>[80,35], true=>[84,32]
|
164
|
+
@created_at = (Date.today - 30).to_time
|
165
|
+
@completed_at = (Date.today - 15).to_time
|
166
|
+
end
|
167
|
+
|
168
|
+
Vanity.context = Object.new
|
169
|
+
Vanity.context.instance_eval { def vanity_identity ; 0 ; end }
|
170
|
+
signups = 50
|
171
|
+
(Date.today - 90..Date.today).each do |date|
|
172
|
+
Timecop.travel date do
|
173
|
+
signups += rand(15) - 5
|
174
|
+
Vanity.playground.track! :signups, signups
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
cheers, yawns = 0, 0
|
179
|
+
(Date.today - 80..Date.today).each do |date|
|
180
|
+
Timecop.travel date do
|
181
|
+
cheers = cheers - 5 + rand(20)
|
182
|
+
Vanity.playground.track! :yawns, cheers
|
183
|
+
yawns = yawns - 5 + rand(30)
|
184
|
+
Vanity.playground.track! :cheers, yawns
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
Vanity::Commands.report ENV["OUTPUT"]
|
189
|
+
end
|