vanity 2.0.0.beta5 → 2.0.0.beta6
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.
- data/.travis.yml +3 -0
- data/Appraisals +3 -2
- data/Gemfile.lock +2 -2
- data/README.rdoc +21 -7
- data/config/locales/vanity.en.yml +2 -0
- data/gemfiles/rails32.gemfile.lock +1 -1
- data/gemfiles/rails4.gemfile +2 -1
- data/gemfiles/rails4.gemfile.lock +43 -46
- data/gemfiles/rails41.gemfile +1 -1
- data/gemfiles/rails41.gemfile.lock +44 -49
- data/gemfiles/rails42.gemfile.lock +1 -1
- data/lib/vanity.rb +0 -1
- data/lib/vanity/adapters/active_record_adapter.rb +2 -6
- data/lib/vanity/adapters/redis_adapter.rb +0 -1
- data/lib/vanity/commands/report.rb +9 -0
- data/lib/vanity/experiment/ab_test.rb +8 -0
- data/lib/vanity/frameworks/rails.rb +13 -0
- data/lib/vanity/helpers.rb +1 -3
- data/lib/vanity/metric/active_record.rb +1 -1
- data/lib/vanity/templates/_experiment.erb +6 -0
- data/lib/vanity/templates/_experiments.erb +1 -1
- data/lib/vanity/templates/vanity.js +12 -0
- data/lib/vanity/version.rb +1 -1
- data/test/cli_test.rb +4 -0
- data/test/commands/report_test.rb +1 -1
- data/test/dummy/config/database.yml +1 -9
- data/test/experiment/ab_test.rb +22 -1
- data/test/frameworks/rails/action_controller_test.rb +53 -7
- data/test/metric/base_test.rb +11 -0
- data/test/templates_test.rb +4 -0
- data/test/test_helper.rb +4 -7
- metadata +22 -15
- checksums.yaml +0 -7
- data/lib/vanity/backport.rb +0 -25
data/.travis.yml
CHANGED
@@ -10,6 +10,7 @@ rvm:
|
|
10
10
|
- 1.9.3
|
11
11
|
- 2.0.0
|
12
12
|
- 2.1.0
|
13
|
+
- 2.2.0
|
13
14
|
- ruby-head
|
14
15
|
env:
|
15
16
|
- DB=mongodb
|
@@ -24,5 +25,7 @@ before_script:
|
|
24
25
|
- 'echo ''gem: --no-ri --no-rdoc'' > ~/.gemrc' # skip installing docs for gems
|
25
26
|
matrix:
|
26
27
|
exclude:
|
28
|
+
- rvm: 2.2.0
|
29
|
+
gemfile: gemfiles/rails32.gemfile
|
27
30
|
allow_failures:
|
28
31
|
- rvm: ruby-head
|
data/Appraisals
CHANGED
@@ -8,14 +8,15 @@ end
|
|
8
8
|
|
9
9
|
appraise "rails4" do
|
10
10
|
gem "mocha", "~> 1.0", :require=>false
|
11
|
-
gem "rails", "4.0.
|
11
|
+
gem "rails", "4.0.13"
|
12
12
|
gem "fastthread", :git => "git://github.com/zoltankiss/fastthread.git", :platforms => :mri_20
|
13
13
|
gem "passenger", "~>3.0"
|
14
|
+
gem 'test-unit'
|
14
15
|
end
|
15
16
|
|
16
17
|
appraise "rails41" do
|
17
18
|
gem "mocha", "~> 1.0", :require=>false
|
18
|
-
gem "rails", "4.1.
|
19
|
+
gem "rails", "4.1.9"
|
19
20
|
gem "fastthread", :git => "git://github.com/zoltankiss/fastthread.git", :platforms => :mri_20
|
20
21
|
gem "passenger", "~>3.0"
|
21
22
|
end
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
vanity (2.0.0.
|
4
|
+
vanity (2.0.0.beta6)
|
5
5
|
i18n
|
6
6
|
|
7
7
|
GEM
|
@@ -50,7 +50,7 @@ GEM
|
|
50
50
|
redis-namespace (1.3.2)
|
51
51
|
redis (~> 3.0.4)
|
52
52
|
rubystats (0.2.3)
|
53
|
-
sqlite3 (1.3.
|
53
|
+
sqlite3 (1.3.10)
|
54
54
|
syntax (1.0.0)
|
55
55
|
thor (0.18.1)
|
56
56
|
timecop (0.3.5)
|
data/README.rdoc
CHANGED
@@ -35,6 +35,15 @@ Add to your Gemfile:
|
|
35
35
|
|
36
36
|
By default Vanity is configured to use Redis on localhost port 6379 with database 0.
|
37
37
|
|
38
|
+
A sample <code>config/vanity.yml</code> might look like:
|
39
|
+
|
40
|
+
test:
|
41
|
+
collecting: false
|
42
|
+
production:
|
43
|
+
adapter: redis
|
44
|
+
connection: redis://<%= ENV["REDIS_USER"] %>:<%= ENV["REDIS_PASSWORD"] %>@<%= ENV["REDIS_HOST"] %>:<%= ENV["REDIS_PORT"] %>/0
|
45
|
+
|
46
|
+
|
38
47
|
===== MongoDB Setup
|
39
48
|
|
40
49
|
Add to your Gemfile:
|
@@ -70,10 +79,7 @@ A sample <code>config/vanity.yml</code> might look like:
|
|
70
79
|
collecting: false
|
71
80
|
production:
|
72
81
|
adapter: active_record
|
73
|
-
active_record_adapter:
|
74
|
-
database: vanity_test
|
75
|
-
pool: 5
|
76
|
-
timeout: 5000
|
82
|
+
active_record_adapter: default
|
77
83
|
|
78
84
|
If you're going to store data in the database, run the generator and migrations to create the database schema:
|
79
85
|
|
@@ -86,7 +92,6 @@ Turn Vanity on, and pass a reference to a method that identifies a user. For exa
|
|
86
92
|
|
87
93
|
class ApplicationController < ActionController::Base
|
88
94
|
use_vanity :current_user
|
89
|
-
layout false # exclude this if you want to use your application layout
|
90
95
|
end
|
91
96
|
|
92
97
|
For more information, please see the {identity documentation}[http://vanity.labnotes.org/identity.html].
|
@@ -141,12 +146,15 @@ In <code>config/routes.rb</code>, add:
|
|
141
146
|
get '/vanity/participant/:id' => 'vanity#participant'
|
142
147
|
post '/vanity/complete'
|
143
148
|
post '/vanity/chooses'
|
149
|
+
post '/vanity/reset'
|
144
150
|
post '/vanity/add_participant'
|
151
|
+
get '/vanity/image'
|
145
152
|
|
146
153
|
The controller should look like:
|
147
154
|
|
148
155
|
class VanityController < ApplicationController
|
149
156
|
include Vanity::Rails::Dashboard
|
157
|
+
layout false # exclude this if you want to use your application layout
|
150
158
|
end
|
151
159
|
|
152
160
|
== Registering participants with Javascript
|
@@ -165,10 +173,16 @@ Here's what's tested and known to work:
|
|
165
173
|
|
166
174
|
Ruby 1.9.3
|
167
175
|
Persistence: Redis, Mongo, ActiveRecord
|
168
|
-
Rails: 3.2, 4.
|
176
|
+
Rails: 3.2, 4.x
|
169
177
|
Ruby 2.0
|
170
178
|
Persistence: Redis, Mongo, ActiveRecord
|
171
|
-
Rails: 3.2, 4.
|
179
|
+
Rails: 3.2, 4.x
|
180
|
+
Ruby 2.1
|
181
|
+
Persistence: Redis, Mongo, ActiveRecord
|
182
|
+
Rails: 3.2, 4.x
|
183
|
+
Ruby 2.2
|
184
|
+
Persistence: Redis, Mongo, ActiveRecord
|
185
|
+
Rails: 4.0
|
172
186
|
|
173
187
|
== Testing
|
174
188
|
|
@@ -15,6 +15,7 @@ en:
|
|
15
15
|
converted_percentage: '%{alternative} converted at %{percentage}%.'
|
16
16
|
currently_shown: 'currently shown'
|
17
17
|
didnt_convert: '%{alternative} did not convert.'
|
18
|
+
experiment_has_been_reset: '%{name} experiment has been reset.'
|
18
19
|
experiment_participants:
|
19
20
|
one: 'There is one participant in this experiment.'
|
20
21
|
other: 'There are %{count} participants in this experiment.'
|
@@ -32,6 +33,7 @@ en:
|
|
32
33
|
participants:
|
33
34
|
one: '1 participant'
|
34
35
|
other: '%{count} participants'
|
36
|
+
reset: 'Reset'
|
35
37
|
report: 'Vanity Report: %{timestamp}'
|
36
38
|
result_isnt_significant: 'This result is not statistically significant, suggest you continue this experiment.'
|
37
39
|
selected_as_best: '%{alternative} selected as the best alternative.'
|
data/gemfiles/rails4.gemfile
CHANGED
@@ -14,9 +14,10 @@ gem "garb", "< 0.9.2"
|
|
14
14
|
gem "timecop", :require=>false
|
15
15
|
gem "webmock", :require=>false
|
16
16
|
gem "mocha", "~> 1.0", :require=>false
|
17
|
-
gem "rails", "4.0.
|
17
|
+
gem "rails", "4.0.13"
|
18
18
|
gem "fastthread", :git=>"git://github.com/zoltankiss/fastthread.git", :platforms=>:mri_20
|
19
19
|
gem "passenger", "~>3.0"
|
20
|
+
gem "test-unit"
|
20
21
|
|
21
22
|
group :development do
|
22
23
|
gem "appraisal", ">= 1.0.0.beta2"
|
@@ -7,33 +7,33 @@ GIT
|
|
7
7
|
PATH
|
8
8
|
remote: ..
|
9
9
|
specs:
|
10
|
-
vanity (2.0.0.
|
10
|
+
vanity (2.0.0.beta6)
|
11
11
|
i18n
|
12
12
|
|
13
13
|
GEM
|
14
14
|
remote: https://rubygems.org/
|
15
15
|
specs:
|
16
16
|
RedCloth (4.2.9)
|
17
|
-
actionmailer (4.0.
|
18
|
-
actionpack (= 4.0.
|
19
|
-
mail (~> 2.5.
|
20
|
-
actionpack (4.0.
|
21
|
-
activesupport (= 4.0.
|
17
|
+
actionmailer (4.0.13)
|
18
|
+
actionpack (= 4.0.13)
|
19
|
+
mail (~> 2.5, >= 2.5.4)
|
20
|
+
actionpack (4.0.13)
|
21
|
+
activesupport (= 4.0.13)
|
22
22
|
builder (~> 3.1.0)
|
23
23
|
erubis (~> 2.7.0)
|
24
24
|
rack (~> 1.5.2)
|
25
25
|
rack-test (~> 0.6.2)
|
26
|
-
activemodel (4.0.
|
27
|
-
activesupport (= 4.0.
|
26
|
+
activemodel (4.0.13)
|
27
|
+
activesupport (= 4.0.13)
|
28
28
|
builder (~> 3.1.0)
|
29
|
-
activerecord (4.0.
|
30
|
-
activemodel (= 4.0.
|
29
|
+
activerecord (4.0.13)
|
30
|
+
activemodel (= 4.0.13)
|
31
31
|
activerecord-deprecated_finders (~> 1.0.2)
|
32
|
-
activesupport (= 4.0.
|
32
|
+
activesupport (= 4.0.13)
|
33
33
|
arel (~> 4.0.0)
|
34
34
|
activerecord-deprecated_finders (1.0.3)
|
35
|
-
activesupport (4.0.
|
36
|
-
i18n (~> 0.6, >= 0.6.
|
35
|
+
activesupport (4.0.13)
|
36
|
+
i18n (~> 0.6, >= 0.6.9)
|
37
37
|
minitest (~> 4.2)
|
38
38
|
multi_json (~> 1.3)
|
39
39
|
thread_safe (~> 0.1)
|
@@ -45,8 +45,7 @@ GEM
|
|
45
45
|
bundler
|
46
46
|
rake
|
47
47
|
thor (>= 0.14.0)
|
48
|
-
arel (4.0.
|
49
|
-
atomic (1.1.14)
|
48
|
+
arel (4.0.2)
|
50
49
|
bson (1.9.2)
|
51
50
|
bson_ext (1.9.2)
|
52
51
|
bson (~> 1.9.2)
|
@@ -63,7 +62,7 @@ GEM
|
|
63
62
|
activesupport (>= 2.2.0)
|
64
63
|
crack (>= 0.1.6)
|
65
64
|
hike (1.2.3)
|
66
|
-
i18n (0.
|
65
|
+
i18n (0.7.0)
|
67
66
|
integration (0.1.0)
|
68
67
|
jekyll (0.11.2)
|
69
68
|
albino (~> 1.3)
|
@@ -74,68 +73,65 @@ GEM
|
|
74
73
|
maruku (~> 0.5)
|
75
74
|
kramdown (0.13.5)
|
76
75
|
liquid (2.3.0)
|
77
|
-
mail (2.
|
78
|
-
mime-types (
|
79
|
-
treetop (~> 1.4.8)
|
76
|
+
mail (2.6.3)
|
77
|
+
mime-types (>= 1.16, < 3)
|
80
78
|
maruku (0.6.0)
|
81
79
|
syntax (>= 1.0.0)
|
82
80
|
metaclass (0.0.4)
|
83
|
-
mime-types (
|
81
|
+
mime-types (2.4.3)
|
84
82
|
minitest (4.7.5)
|
85
83
|
mocha (1.0.0)
|
86
84
|
metaclass (~> 0.0.1)
|
87
85
|
mongo (1.9.2)
|
88
86
|
bson (~> 1.9.2)
|
89
|
-
multi_json (1.
|
87
|
+
multi_json (1.10.1)
|
90
88
|
passenger (3.0.21)
|
91
89
|
daemon_controller (>= 1.0.0)
|
92
90
|
fastthread (>= 1.0.1)
|
93
91
|
rack
|
94
92
|
rake (>= 0.8.1)
|
95
|
-
polyglot (0.3.3)
|
96
93
|
posix-spawn (0.3.6)
|
94
|
+
power_assert (0.2.2)
|
97
95
|
rack (1.5.2)
|
98
|
-
rack-test (0.6.
|
96
|
+
rack-test (0.6.3)
|
99
97
|
rack (>= 1.0)
|
100
|
-
rails (4.0.
|
101
|
-
actionmailer (= 4.0.
|
102
|
-
actionpack (= 4.0.
|
103
|
-
activerecord (= 4.0.
|
104
|
-
activesupport (= 4.0.
|
98
|
+
rails (4.0.13)
|
99
|
+
actionmailer (= 4.0.13)
|
100
|
+
actionpack (= 4.0.13)
|
101
|
+
activerecord (= 4.0.13)
|
102
|
+
activesupport (= 4.0.13)
|
105
103
|
bundler (>= 1.3.0, < 2.0)
|
106
|
-
railties (= 4.0.
|
107
|
-
sprockets-rails (~> 2.0
|
108
|
-
railties (4.0.
|
109
|
-
actionpack (= 4.0.
|
110
|
-
activesupport (= 4.0.
|
104
|
+
railties (= 4.0.13)
|
105
|
+
sprockets-rails (~> 2.0)
|
106
|
+
railties (4.0.13)
|
107
|
+
actionpack (= 4.0.13)
|
108
|
+
activesupport (= 4.0.13)
|
111
109
|
rake (>= 0.8.7)
|
112
110
|
thor (>= 0.18.1, < 2.0)
|
113
|
-
rake (10.
|
111
|
+
rake (10.4.2)
|
114
112
|
redis (3.0.6)
|
115
113
|
redis-namespace (1.3.2)
|
116
114
|
redis (~> 3.0.4)
|
117
115
|
rubystats (0.2.3)
|
118
116
|
safe_yaml (0.9.7)
|
119
|
-
sprockets (2.
|
117
|
+
sprockets (2.12.3)
|
120
118
|
hike (~> 1.2)
|
121
119
|
multi_json (~> 1.0)
|
122
120
|
rack (~> 1.0)
|
123
121
|
tilt (~> 1.1, != 1.3.0)
|
124
|
-
sprockets-rails (2.
|
122
|
+
sprockets-rails (2.2.4)
|
125
123
|
actionpack (>= 3.0)
|
126
124
|
activesupport (>= 3.0)
|
127
|
-
sprockets (
|
128
|
-
sqlite3 (1.3.
|
125
|
+
sprockets (>= 2.8, < 4.0)
|
126
|
+
sqlite3 (1.3.10)
|
129
127
|
syntax (1.0.0)
|
130
|
-
|
131
|
-
|
132
|
-
|
128
|
+
test-unit (3.0.9)
|
129
|
+
power_assert
|
130
|
+
thor (0.19.1)
|
131
|
+
thread_safe (0.3.4)
|
133
132
|
tilt (1.4.1)
|
134
133
|
timecop (0.6.3)
|
135
|
-
|
136
|
-
polyglot
|
137
|
-
polyglot (>= 0.3.1)
|
138
|
-
tzinfo (0.3.38)
|
134
|
+
tzinfo (0.3.43)
|
139
135
|
webmock (1.15.2)
|
140
136
|
addressable (>= 2.2.7)
|
141
137
|
crack (>= 0.3.2)
|
@@ -158,12 +154,13 @@ DEPENDENCIES
|
|
158
154
|
mongo
|
159
155
|
passenger (~> 3.0)
|
160
156
|
rack
|
161
|
-
rails (= 4.0.
|
157
|
+
rails (= 4.0.13)
|
162
158
|
rake
|
163
159
|
redis (>= 2.1)
|
164
160
|
redis-namespace (>= 1.1.0)
|
165
161
|
rubystats
|
166
162
|
sqlite3
|
163
|
+
test-unit
|
167
164
|
timecop
|
168
165
|
vanity!
|
169
166
|
webmock
|
data/gemfiles/rails41.gemfile
CHANGED
@@ -14,7 +14,7 @@ gem "garb", "< 0.9.2"
|
|
14
14
|
gem "timecop", :require=>false
|
15
15
|
gem "webmock", :require=>false
|
16
16
|
gem "mocha", "~> 1.0", :require=>false
|
17
|
-
gem "rails", "4.1.
|
17
|
+
gem "rails", "4.1.9"
|
18
18
|
gem "fastthread", :git=>"git://github.com/zoltankiss/fastthread.git", :platforms=>:mri_20
|
19
19
|
gem "passenger", "~>3.0"
|
20
20
|
|
@@ -7,34 +7,34 @@ GIT
|
|
7
7
|
PATH
|
8
8
|
remote: .././
|
9
9
|
specs:
|
10
|
-
vanity (2.0.0.
|
10
|
+
vanity (2.0.0.beta6)
|
11
11
|
i18n
|
12
12
|
|
13
13
|
GEM
|
14
14
|
remote: https://rubygems.org/
|
15
15
|
specs:
|
16
16
|
RedCloth (4.2.9)
|
17
|
-
actionmailer (4.1.
|
18
|
-
actionpack (= 4.1.
|
19
|
-
actionview (= 4.1.
|
20
|
-
mail (~> 2.5.4)
|
21
|
-
actionpack (4.1.
|
22
|
-
actionview (= 4.1.
|
23
|
-
activesupport (= 4.1.
|
17
|
+
actionmailer (4.1.9)
|
18
|
+
actionpack (= 4.1.9)
|
19
|
+
actionview (= 4.1.9)
|
20
|
+
mail (~> 2.5, >= 2.5.4)
|
21
|
+
actionpack (4.1.9)
|
22
|
+
actionview (= 4.1.9)
|
23
|
+
activesupport (= 4.1.9)
|
24
24
|
rack (~> 1.5.2)
|
25
25
|
rack-test (~> 0.6.2)
|
26
|
-
actionview (4.1.
|
27
|
-
activesupport (= 4.1.
|
26
|
+
actionview (4.1.9)
|
27
|
+
activesupport (= 4.1.9)
|
28
28
|
builder (~> 3.1)
|
29
29
|
erubis (~> 2.7.0)
|
30
|
-
activemodel (4.1.
|
31
|
-
activesupport (= 4.1.
|
30
|
+
activemodel (4.1.9)
|
31
|
+
activesupport (= 4.1.9)
|
32
32
|
builder (~> 3.1)
|
33
|
-
activerecord (4.1.
|
34
|
-
activemodel (= 4.1.
|
35
|
-
activesupport (= 4.1.
|
33
|
+
activerecord (4.1.9)
|
34
|
+
activemodel (= 4.1.9)
|
35
|
+
activesupport (= 4.1.9)
|
36
36
|
arel (~> 5.0.0)
|
37
|
-
activesupport (4.1.
|
37
|
+
activesupport (4.1.9)
|
38
38
|
i18n (~> 0.6, >= 0.6.9)
|
39
39
|
json (~> 1.7, >= 1.7.7)
|
40
40
|
minitest (~> 5.1)
|
@@ -67,7 +67,7 @@ GEM
|
|
67
67
|
crack (>= 0.1.6)
|
68
68
|
highline (1.6.21)
|
69
69
|
hike (1.2.3)
|
70
|
-
i18n (0.
|
70
|
+
i18n (0.7.0)
|
71
71
|
integration (0.1.0)
|
72
72
|
jekyll (1.5.1)
|
73
73
|
classifier (~> 1.3)
|
@@ -80,24 +80,23 @@ GEM
|
|
80
80
|
redcarpet (~> 2.3.0)
|
81
81
|
safe_yaml (~> 1.0)
|
82
82
|
toml (~> 0.1.0)
|
83
|
-
json (1.8.
|
83
|
+
json (1.8.2)
|
84
84
|
liquid (2.5.5)
|
85
85
|
listen (1.3.1)
|
86
86
|
rb-fsevent (>= 0.9.3)
|
87
87
|
rb-inotify (>= 0.9)
|
88
88
|
rb-kqueue (>= 0.2)
|
89
|
-
mail (2.
|
90
|
-
mime-types (
|
91
|
-
treetop (~> 1.4.8)
|
89
|
+
mail (2.6.3)
|
90
|
+
mime-types (>= 1.16, < 3)
|
92
91
|
maruku (0.7.0)
|
93
92
|
metaclass (0.0.4)
|
94
|
-
mime-types (
|
95
|
-
minitest (5.
|
93
|
+
mime-types (2.4.3)
|
94
|
+
minitest (5.5.1)
|
96
95
|
mocha (1.1.0)
|
97
96
|
metaclass (~> 0.0.1)
|
98
97
|
mongo (1.10.0)
|
99
98
|
bson (~> 1.10.0)
|
100
|
-
multi_json (1.
|
99
|
+
multi_json (1.10.1)
|
101
100
|
parslet (1.5.0)
|
102
101
|
blankslate (~> 2.0)
|
103
102
|
passenger (3.0.21)
|
@@ -105,30 +104,29 @@ GEM
|
|
105
104
|
fastthread (>= 1.0.1)
|
106
105
|
rack
|
107
106
|
rake (>= 0.8.1)
|
108
|
-
polyglot (0.3.4)
|
109
107
|
posix-spawn (0.3.8)
|
110
108
|
pygments.rb (0.5.4)
|
111
109
|
posix-spawn (~> 0.3.6)
|
112
110
|
yajl-ruby (~> 1.1.0)
|
113
111
|
rack (1.5.2)
|
114
|
-
rack-test (0.6.
|
112
|
+
rack-test (0.6.3)
|
115
113
|
rack (>= 1.0)
|
116
|
-
rails (4.1.
|
117
|
-
actionmailer (= 4.1.
|
118
|
-
actionpack (= 4.1.
|
119
|
-
actionview (= 4.1.
|
120
|
-
activemodel (= 4.1.
|
121
|
-
activerecord (= 4.1.
|
122
|
-
activesupport (= 4.1.
|
114
|
+
rails (4.1.9)
|
115
|
+
actionmailer (= 4.1.9)
|
116
|
+
actionpack (= 4.1.9)
|
117
|
+
actionview (= 4.1.9)
|
118
|
+
activemodel (= 4.1.9)
|
119
|
+
activerecord (= 4.1.9)
|
120
|
+
activesupport (= 4.1.9)
|
123
121
|
bundler (>= 1.3.0, < 2.0)
|
124
|
-
railties (= 4.1.
|
122
|
+
railties (= 4.1.9)
|
125
123
|
sprockets-rails (~> 2.0)
|
126
|
-
railties (4.1.
|
127
|
-
actionpack (= 4.1.
|
128
|
-
activesupport (= 4.1.
|
124
|
+
railties (4.1.9)
|
125
|
+
actionpack (= 4.1.9)
|
126
|
+
activesupport (= 4.1.9)
|
129
127
|
rake (>= 0.8.7)
|
130
128
|
thor (>= 0.18.1, < 2.0)
|
131
|
-
rake (10.
|
129
|
+
rake (10.4.2)
|
132
130
|
rb-fsevent (0.9.4)
|
133
131
|
rb-inotify (0.9.3)
|
134
132
|
ffi (>= 0.5.0)
|
@@ -139,27 +137,24 @@ GEM
|
|
139
137
|
redis-namespace (1.4.1)
|
140
138
|
redis (~> 3.0.4)
|
141
139
|
rubystats (0.2.3)
|
142
|
-
safe_yaml (1.0.
|
143
|
-
sprockets (2.12.
|
140
|
+
safe_yaml (1.0.4)
|
141
|
+
sprockets (2.12.3)
|
144
142
|
hike (~> 1.2)
|
145
143
|
multi_json (~> 1.0)
|
146
144
|
rack (~> 1.0)
|
147
145
|
tilt (~> 1.1, != 1.3.0)
|
148
|
-
sprockets-rails (2.
|
146
|
+
sprockets-rails (2.2.4)
|
149
147
|
actionpack (>= 3.0)
|
150
148
|
activesupport (>= 3.0)
|
151
|
-
sprockets (
|
152
|
-
sqlite3 (1.3.
|
149
|
+
sprockets (>= 2.8, < 4.0)
|
150
|
+
sqlite3 (1.3.10)
|
153
151
|
thor (0.19.1)
|
154
|
-
thread_safe (0.3.
|
152
|
+
thread_safe (0.3.4)
|
155
153
|
tilt (1.4.1)
|
156
154
|
timecop (0.7.1)
|
157
155
|
toml (0.1.1)
|
158
156
|
parslet (~> 1.5.0)
|
159
|
-
|
160
|
-
polyglot
|
161
|
-
polyglot (>= 0.3.1)
|
162
|
-
tzinfo (1.1.0)
|
157
|
+
tzinfo (1.2.2)
|
163
158
|
thread_safe (~> 0.1)
|
164
159
|
webmock (1.17.4)
|
165
160
|
addressable (>= 2.2.7)
|
@@ -184,7 +179,7 @@ DEPENDENCIES
|
|
184
179
|
mongo
|
185
180
|
passenger (~> 3.0)
|
186
181
|
rack
|
187
|
-
rails (= 4.1.
|
182
|
+
rails (= 4.1.9)
|
188
183
|
rake
|
189
184
|
redis (>= 2.1)
|
190
185
|
redis-namespace (>= 1.1.0)
|
data/lib/vanity.rb
CHANGED
@@ -27,16 +27,12 @@ module Vanity
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
# Schema model
|
31
|
-
class VanitySchema < VanityRecord
|
32
|
-
self.table_name = :vanity_schema
|
33
|
-
end
|
34
|
-
|
35
30
|
# Metric model
|
36
31
|
class VanityMetric < VanityRecord
|
37
32
|
UPDATED_AT_GRACE_PERIOD = 1.minute
|
38
33
|
self.table_name = :vanity_metrics
|
39
34
|
has_many :vanity_metric_values
|
35
|
+
attr_accessible :metric_id if needs_attr_accessible?
|
40
36
|
|
41
37
|
def self.retrieve(metric)
|
42
38
|
rails_agnostic_find_or_create_by(:metric_id, metric.to_s)
|
@@ -113,7 +109,7 @@ module Vanity
|
|
113
109
|
end
|
114
110
|
|
115
111
|
def active?
|
116
|
-
VanityRecord.connected?
|
112
|
+
VanityRecord.connected? && VanityRecord.connection.active?
|
117
113
|
end
|
118
114
|
|
119
115
|
def disconnect!
|
@@ -28,6 +28,15 @@ module Vanity
|
|
28
28
|
text
|
29
29
|
end
|
30
30
|
|
31
|
+
class ProxyEmpty < String
|
32
|
+
def method_missing(method, *args, &block); self.class.new end
|
33
|
+
end
|
34
|
+
|
35
|
+
# prevent certain url helper methods from failing so we can run erb templates outside of rails for reports.
|
36
|
+
def method_missing(method, *args, &block)
|
37
|
+
%w(url_for flash).include?(method.to_s) ? ProxyEmpty.new : super
|
38
|
+
end
|
39
|
+
|
31
40
|
# Dumbed down from Rails' simple_format.
|
32
41
|
def vanity_simple_format(text, options={})
|
33
42
|
open = "<p #{options.map { |k,v| "#{k}=\"#{CGI.escapeHTML v}\"" }.join(" ")}>"
|
@@ -445,6 +445,14 @@ module Vanity
|
|
445
445
|
connection.destroy_experiment @id
|
446
446
|
super
|
447
447
|
end
|
448
|
+
|
449
|
+
# clears all collected data for the experiment
|
450
|
+
def reset
|
451
|
+
connection.destroy_experiment @id
|
452
|
+
connection.set_experiment_created_at @id, Time.now
|
453
|
+
@outcome = @completed_at = nil
|
454
|
+
self
|
455
|
+
end
|
448
456
|
|
449
457
|
def save
|
450
458
|
true_false unless @alternatives
|
@@ -39,6 +39,12 @@ module Vanity
|
|
39
39
|
# use_vanity { |controller| controller.params[:project_id] }
|
40
40
|
# end
|
41
41
|
def use_vanity(symbol = nil, &block)
|
42
|
+
define_method :vanity_store_experiment_for_js do |name, alternative|
|
43
|
+
@_vanity_experiments ||= {}
|
44
|
+
@_vanity_experiments[name] ||= alternative
|
45
|
+
@_vanity_experiments[name].value
|
46
|
+
end
|
47
|
+
|
42
48
|
if block
|
43
49
|
define_method(:vanity_identity) { block.call(self) }
|
44
50
|
else
|
@@ -317,6 +323,13 @@ module Vanity
|
|
317
323
|
exp.chooses(exp.alternatives[params[:a].to_i].value)
|
318
324
|
render :file=>Vanity.template("_experiment"), :locals=>{:experiment=>exp}
|
319
325
|
end
|
326
|
+
|
327
|
+
def reset
|
328
|
+
exp = Vanity.playground.experiment(params[:e].to_sym)
|
329
|
+
exp.reset
|
330
|
+
flash[:notice] = I18n.t 'vanity.experiment_has_been_reset', name: exp.name
|
331
|
+
render :file=>Vanity.template("_experiment"), :locals=>{:experiment=>exp}
|
332
|
+
end
|
320
333
|
|
321
334
|
# JS callback action used by vanity_js
|
322
335
|
def add_participant
|
data/lib/vanity/helpers.rb
CHANGED
@@ -37,9 +37,7 @@ module Vanity
|
|
37
37
|
# TODO refactor with Vanity::Rails::Helpers#ab_test
|
38
38
|
request = respond_to?(:request) ? self.request : nil
|
39
39
|
if Vanity.playground.using_js?
|
40
|
-
|
41
|
-
@_vanity_experiments[name] ||= Vanity.playground.experiment(name).choose(request)
|
42
|
-
value = @_vanity_experiments[name].value
|
40
|
+
value = Vanity.context.vanity_store_experiment_for_js name, Vanity.playground.experiment(name).choose(request)
|
43
41
|
else
|
44
42
|
value = Vanity.playground.experiment(name).choose(request).value
|
45
43
|
end
|
@@ -99,7 +99,7 @@ module Vanity
|
|
99
99
|
def after_create(record)
|
100
100
|
return unless @playground.collecting?
|
101
101
|
count = @ar_column ? (record.send(@ar_column) || 0) : 1
|
102
|
-
call_hooks record.send(@ar_timestamp), nil, [count] if count > 0 && @ar_scoped.exists?(record)
|
102
|
+
call_hooks record.send(@ar_timestamp), nil, [count] if count > 0 && @ar_scoped.exists?(record.id)
|
103
103
|
end
|
104
104
|
end
|
105
105
|
end
|
@@ -1,5 +1,11 @@
|
|
1
1
|
<h3><%=vanity_h experiment.name %> <span class="type">(<%= experiment.class.friendly_name %>)</span></h3>
|
2
2
|
<%= experiment.description.to_s.split(/\n\s*\n/).map { |para| vanity_html_safe(%{<p class="description">#{vanity_h para}</p>}) }.join.html_safe %>
|
3
|
+
<% if flash.notice %>
|
4
|
+
<p>
|
5
|
+
<%= flash.notice %>
|
6
|
+
</p>
|
7
|
+
<% end %>
|
8
|
+
<a class="button reset" title="<%= I18n.t('vanity.reset') %>" href="#" data-id="<%= experiment.id %>" data-url="<%= url_for(:action=>:reset, :e=>experiment.id) %>"><%= I18n.t 'vanity.reset' %></a>
|
3
9
|
<%= render :file => Vanity.template("_" + experiment.type), :locals => {:experiment => experiment} %>
|
4
10
|
<p class="meta">
|
5
11
|
<%= I18n.t('vanity.started_at', :timestamp=>I18n.l(experiment.created_at, :format=>'%a, %b %d')) %>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<ul class="experiments">
|
2
|
-
<% experiments.sort_by { |id, experiment| experiment.
|
2
|
+
<% experiments.sort_by{|id, experiment| experiment.created_at}.sort_by{ |id, experiment| experiment.name }.reverse.each do |id, experiment| %>
|
3
3
|
<li class="experiment <%= experiment.type %>" id="experiment_<%=vanity_h id.to_s %>">
|
4
4
|
<%= render :file => Vanity.template("_experiment"), :locals => { :id => id, :experiment => experiment } %>
|
5
5
|
</li>
|
@@ -79,4 +79,16 @@ $(function() {
|
|
79
79
|
});
|
80
80
|
return false;
|
81
81
|
});
|
82
|
+
|
83
|
+
$(".experiment a.button.reset").live("click", function() {
|
84
|
+
if (confirm('Are you sure you want to reset the experiment? This will clear all collected data so far and restart the experiment from scratch. This cannot be undone.')){
|
85
|
+
var link = $(this);
|
86
|
+
$.ajax({
|
87
|
+
data: 'authenticity_token=' + encodeURIComponent(document.auth_token),
|
88
|
+
success: function(request){ $('#experiment_' + link.attr("data-id")).html(request) },
|
89
|
+
url: link.attr("data-url"), type: 'post'
|
90
|
+
});
|
91
|
+
}
|
92
|
+
return false;
|
93
|
+
});
|
82
94
|
});
|
data/lib/vanity/version.rb
CHANGED
data/test/cli_test.rb
CHANGED
@@ -9,14 +9,6 @@
|
|
9
9
|
# Set databases in all environments since we may test loading Rails in non-
|
10
10
|
# test environments
|
11
11
|
|
12
|
-
development:
|
13
|
-
adapter: sqlite3
|
14
|
-
database: ":memory:"
|
15
|
-
|
16
12
|
test:
|
17
13
|
adapter: sqlite3
|
18
|
-
database:
|
19
|
-
|
20
|
-
production:
|
21
|
-
adapter: sqlite3
|
22
|
-
database: ":memory:"
|
14
|
+
database: vanity_test.sqlite3
|
data/test/experiment/ab_test.rb
CHANGED
@@ -609,7 +609,7 @@ class AbTestTest < ActionController::TestCase
|
|
609
609
|
assert experiment(:abcd).score.alts.all? { |alt| alt.difference.nil? }
|
610
610
|
assert_equal 1, experiment(:abcd).score.best.id
|
611
611
|
assert_nil experiment(:abcd).score.choice
|
612
|
-
|
612
|
+
assert_includes [0,2,3], experiment(:abcd).score.base.id
|
613
613
|
assert_equal 1, experiment(:abcd).score.least.id
|
614
614
|
end
|
615
615
|
|
@@ -1021,6 +1021,27 @@ This experiment did not run long enough to find a clear winner.
|
|
1021
1021
|
assert [:a, :b, :c].include?(choice)
|
1022
1022
|
assert_equal choice, experiment(:simple).choose.value
|
1023
1023
|
end
|
1024
|
+
|
1025
|
+
def test_reset_clears_participants
|
1026
|
+
new_ab_test :simple do
|
1027
|
+
alternatives :a, :b, :c
|
1028
|
+
metrics :coolness
|
1029
|
+
end
|
1030
|
+
experiment(:simple).chooses(:b)
|
1031
|
+
assert_equal experiment(:simple).alternatives[1].participants, 1
|
1032
|
+
experiment(:simple).reset
|
1033
|
+
assert_equal experiment(:simple).alternatives[1].participants, 0
|
1034
|
+
end
|
1035
|
+
|
1036
|
+
def test_clears_outcome_and_completed_at
|
1037
|
+
new_ab_test :simple do
|
1038
|
+
alternatives :a, :b, :c
|
1039
|
+
metrics :coolness
|
1040
|
+
end
|
1041
|
+
experiment(:simple).reset
|
1042
|
+
assert_nil experiment(:simple).outcome
|
1043
|
+
assert_nil experiment(:simple).completed_at
|
1044
|
+
end
|
1024
1045
|
|
1025
1046
|
|
1026
1047
|
# -- Helper methods --
|
@@ -1,6 +1,13 @@
|
|
1
1
|
require "test_helper"
|
2
2
|
|
3
|
+
# Pages accessible to everyone, e.g. sign in, community search.
|
3
4
|
class UseVanityController < ActionController::Base
|
5
|
+
class TestModel
|
6
|
+
def test_method
|
7
|
+
ab_test(:pie_or_cake)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
4
11
|
attr_accessor :current_user
|
5
12
|
|
6
13
|
def index
|
@@ -11,9 +18,37 @@ class UseVanityController < ActionController::Base
|
|
11
18
|
ab_test(:pie_or_cake)
|
12
19
|
render :inline => "<%= vanity_js -%>"
|
13
20
|
end
|
21
|
+
|
22
|
+
def model_js
|
23
|
+
TestModel.new.test_method
|
24
|
+
render :inline => "<%= vanity_js -%>"
|
25
|
+
end
|
14
26
|
end
|
15
27
|
|
16
|
-
#
|
28
|
+
# class UseVanityControllerTest < ActionController::TestCase
|
29
|
+
# tests UseVanityController
|
30
|
+
|
31
|
+
# def setup
|
32
|
+
# super
|
33
|
+
# new_ab_test :pie_or_cake do
|
34
|
+
# metrics :sugar_high
|
35
|
+
# end
|
36
|
+
|
37
|
+
# # Class eval this instead of including in the controller to delay
|
38
|
+
# # execution until the request exists in the context of the test
|
39
|
+
# UseVanityController.class_eval do
|
40
|
+
# use_vanity :current_user
|
41
|
+
# end
|
42
|
+
# end
|
43
|
+
|
44
|
+
# def teardown
|
45
|
+
# super
|
46
|
+
# end
|
47
|
+
|
48
|
+
# def test_bootstraps_metric
|
49
|
+
# end
|
50
|
+
# end
|
51
|
+
|
17
52
|
class UseVanityControllerTest < ActionController::TestCase
|
18
53
|
tests UseVanityController
|
19
54
|
|
@@ -23,19 +58,34 @@ class UseVanityControllerTest < ActionController::TestCase
|
|
23
58
|
new_ab_test :pie_or_cake do
|
24
59
|
metrics :sugar_high
|
25
60
|
end
|
61
|
+
|
62
|
+
# Class eval this instead of including in the controller to delay
|
63
|
+
# execution until the request exists in the context of the test
|
26
64
|
UseVanityController.class_eval do
|
27
65
|
use_vanity :current_user
|
28
66
|
end
|
29
|
-
|
67
|
+
|
68
|
+
# Rails 3 configuration for cookies
|
69
|
+
if ::Rails.respond_to?(:application)
|
30
70
|
::Rails.application.config.session_options[:domain] = '.foo.bar'
|
31
71
|
end
|
32
72
|
end
|
33
73
|
|
74
|
+
def teardown
|
75
|
+
super
|
76
|
+
end
|
77
|
+
|
34
78
|
def test_render_js_for_tests
|
35
79
|
Vanity.playground.use_js!
|
36
80
|
get :js
|
37
81
|
assert_match /script.*v=pie_or_cake=.*script/m, @response.body
|
38
82
|
end
|
83
|
+
|
84
|
+
def test_render_model_js_for_tests
|
85
|
+
Vanity.playground.use_js!
|
86
|
+
get :model_js
|
87
|
+
assert_match /script.*v=pie_or_cake=.*script/m, @response.body
|
88
|
+
end
|
39
89
|
|
40
90
|
def test_chooses_sets_alternatives_for_rails_tests
|
41
91
|
experiment(:pie_or_cake).chooses(true)
|
@@ -109,7 +159,7 @@ class UseVanityControllerTest < ActionController::TestCase
|
|
109
159
|
assert_equal "576", @controller.send(:vanity_identity)
|
110
160
|
end
|
111
161
|
|
112
|
-
def
|
162
|
+
def test_vanity_identity_set_with_identity_paramater
|
113
163
|
get :index, :_identity => "id_from_params"
|
114
164
|
assert_equal "id_from_params", @controller.send(:vanity_identity)
|
115
165
|
end
|
@@ -177,8 +227,4 @@ class UseVanityControllerTest < ActionController::TestCase
|
|
177
227
|
assert_match /domain=.foo.bar/, @response["Set-Cookie"] if ::Rails.respond_to?(:application)
|
178
228
|
end
|
179
229
|
|
180
|
-
def teardown
|
181
|
-
super
|
182
|
-
end
|
183
|
-
|
184
230
|
end
|
data/test/metric/base_test.rb
CHANGED
@@ -63,6 +63,17 @@ describe "Metric via playground" do
|
|
63
63
|
assert Vanity.playground.metrics.empty?
|
64
64
|
end
|
65
65
|
|
66
|
+
it "bootstraps the metric" do
|
67
|
+
File.open "tmp/experiments/metrics/yawns_sec.rb", "w" do |f|
|
68
|
+
f.write <<-RUBY
|
69
|
+
metric "yawns/hour" do
|
70
|
+
end
|
71
|
+
RUBY
|
72
|
+
end
|
73
|
+
Vanity.playground.track!(:yawns_sec)
|
74
|
+
Vanity.playground.track!(:yawns_sec)
|
75
|
+
assert Vanity.playground.connection.get_metric_last_update_at(:yawns_sec)
|
76
|
+
end
|
66
77
|
end
|
67
78
|
|
68
79
|
|
data/test/templates_test.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -49,7 +49,7 @@ module VanityTestHelpers
|
|
49
49
|
DATABASE = {
|
50
50
|
"redis"=>"redis://localhost/15",
|
51
51
|
"mongodb"=>"mongodb://localhost/vanity",
|
52
|
-
"active_record"=> { "adapter"=>"active_record", "active_record_adapter"=>"
|
52
|
+
"active_record"=> { "adapter"=>"active_record", "active_record_adapter"=>"default" },
|
53
53
|
"mock"=>"mock:/"
|
54
54
|
}[ENV["DB"]] or raise "No support yet for #{ENV["DB"]}"
|
55
55
|
|
@@ -69,7 +69,8 @@ module VanityTestHelpers
|
|
69
69
|
# or reload an experiment (saved by the previous playground).
|
70
70
|
def new_playground
|
71
71
|
Vanity.playground = Vanity::Playground.new(:logger=>$logger, :load_path=>"tmp/experiments")
|
72
|
-
|
72
|
+
ActiveRecord::Base.establish_connection
|
73
|
+
Vanity.playground.establish_connection(DATABASE)
|
73
74
|
end
|
74
75
|
|
75
76
|
# Defines the specified metrics (one or more names). Returns metric, or array
|
@@ -161,14 +162,10 @@ if defined?(ActionController::TestCase)
|
|
161
162
|
end
|
162
163
|
|
163
164
|
if ENV["DB"] == "active_record"
|
164
|
-
|
165
|
-
connection[:adapter] = VanityTestHelpers::DATABASE['active_record_adapter']
|
166
|
-
connection[:database] = VanityTestHelpers::DATABASE['database']
|
167
|
-
ActiveRecord::Base.establish_connection(connection)
|
165
|
+
ActiveRecord::Base.establish_connection
|
168
166
|
ActiveRecord::Base.logger = $logger
|
169
167
|
|
170
168
|
require "generators/templates/vanity_migration"
|
171
169
|
VanityMigration.down rescue nil
|
172
170
|
VanityMigration.up
|
173
|
-
ActiveRecord::Base.connection_pool.disconnect!
|
174
171
|
end
|
metadata
CHANGED
@@ -1,55 +1,62 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vanity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.
|
4
|
+
version: 2.0.0.beta6
|
5
|
+
prerelease: 6
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Assaf Arkin
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2015-
|
12
|
+
date: 2015-04-27 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: i18n
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
|
-
- - '>='
|
19
|
+
- - ! '>='
|
18
20
|
- !ruby/object:Gem::Version
|
19
21
|
version: '0'
|
20
22
|
type: :runtime
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
|
-
- - '>='
|
27
|
+
- - ! '>='
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: '0'
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: bundler
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
|
-
- - '>='
|
35
|
+
- - ! '>='
|
32
36
|
- !ruby/object:Gem::Version
|
33
37
|
version: 1.0.0
|
34
38
|
type: :development
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
|
-
- - '>='
|
43
|
+
- - ! '>='
|
39
44
|
- !ruby/object:Gem::Version
|
40
45
|
version: 1.0.0
|
41
46
|
- !ruby/object:Gem::Dependency
|
42
47
|
name: minitest
|
43
48
|
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
44
50
|
requirements:
|
45
|
-
- - '>='
|
51
|
+
- - ! '>='
|
46
52
|
- !ruby/object:Gem::Version
|
47
53
|
version: '4.2'
|
48
54
|
type: :development
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
51
58
|
requirements:
|
52
|
-
- - '>='
|
59
|
+
- - ! '>='
|
53
60
|
- !ruby/object:Gem::Version
|
54
61
|
version: '4.2'
|
55
62
|
description: Mirror, mirror on the wall ...
|
@@ -117,7 +124,6 @@ files:
|
|
117
124
|
- lib/vanity/adapters/mongodb_adapter.rb
|
118
125
|
- lib/vanity/adapters/redis_adapter.rb
|
119
126
|
- lib/vanity/autoconnect.rb
|
120
|
-
- lib/vanity/backport.rb
|
121
127
|
- lib/vanity/commands/list.rb
|
122
128
|
- lib/vanity/commands/report.rb
|
123
129
|
- lib/vanity/experiment/ab_test.rb
|
@@ -196,11 +202,10 @@ files:
|
|
196
202
|
homepage: http://vanity.labnotes.org
|
197
203
|
licenses:
|
198
204
|
- MIT
|
199
|
-
metadata: {}
|
200
205
|
post_install_message: To get started run vanity --help
|
201
206
|
rdoc_options:
|
202
207
|
- --title
|
203
|
-
- Vanity 2.0.0.
|
208
|
+
- Vanity 2.0.0.beta6
|
204
209
|
- --main
|
205
210
|
- README.rdoc
|
206
211
|
- --webcvs
|
@@ -208,20 +213,22 @@ rdoc_options:
|
|
208
213
|
require_paths:
|
209
214
|
- lib
|
210
215
|
required_ruby_version: !ruby/object:Gem::Requirement
|
216
|
+
none: false
|
211
217
|
requirements:
|
212
|
-
- - '>='
|
218
|
+
- - ! '>='
|
213
219
|
- !ruby/object:Gem::Version
|
214
220
|
version: 1.9.3
|
215
221
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
222
|
+
none: false
|
216
223
|
requirements:
|
217
|
-
- - '>'
|
224
|
+
- - ! '>'
|
218
225
|
- !ruby/object:Gem::Version
|
219
226
|
version: 1.3.1
|
220
227
|
requirements: []
|
221
228
|
rubyforge_project:
|
222
|
-
rubygems_version:
|
229
|
+
rubygems_version: 1.8.23
|
223
230
|
signing_key:
|
224
|
-
specification_version:
|
231
|
+
specification_version: 3
|
225
232
|
summary: Experience Driven Development framework for Ruby
|
226
233
|
test_files:
|
227
234
|
- test/adapters/redis_adapter_test.rb
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 64da19676a0a785baf7a4fad506d4919282a4622
|
4
|
-
data.tar.gz: 4fde55bdf334eb8947891156e8ffa8e2c4db3d84
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: f363b4c0d159729aab12104b5c748437fab61eabdec113eca24c6eb6e9f0b5bfc3b6a8490f467e7158a19c97cd28303a97af0a8cce059b32ffec77599e4e056a
|
7
|
-
data.tar.gz: f4519c3151ff503cf5c329c528c6c55c7809342576739d66a2fb2cfa3d3bebb046a9d8e546569b744300867ee5b4519586adbbf8f57982ac89bd03613ac3dac0
|
data/lib/vanity/backport.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
class Time
|
2
|
-
unless method_defined?(:to_date)
|
3
|
-
# Backported from Ruby 1.9.
|
4
|
-
def to_date
|
5
|
-
jd = Date.__send__(:civil_to_jd, year, mon, mday, Date::ITALY)
|
6
|
-
Date.new!(Date.__send__(:jd_to_ajd, jd, 0, 0), 0, Date::ITALY)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
class Date
|
12
|
-
unless method_defined?(:to_date)
|
13
|
-
# Backported from Ruby 1.9.
|
14
|
-
def to_date
|
15
|
-
self
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
unless method_defined?(:to_time)
|
20
|
-
# Backported from Ruby 1.9.
|
21
|
-
def to_time
|
22
|
-
Time.local(year, mon, mday)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|