vanity 2.2.4 → 2.2.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 843eb11cbc6e68d0c354f22405f3e3184ed8c4e6
4
- data.tar.gz: a419f3516e37ec3c8a4028cdee22286a7b0251c0
3
+ metadata.gz: 63e3e69d3a1d79cb7f36548e9b7c5a2ddf626b17
4
+ data.tar.gz: 645fa9b2a710b2f0b7f631747bda160aed94c9eb
5
5
  SHA512:
6
- metadata.gz: 258d933e1eabd33b645083f25f70a1075fbfcf6086f3f388da1519ed11015ad1af7cd960e88276687b103f8776f607095505137f73bb48015362c2b1651b85ce
7
- data.tar.gz: d85493029ebc5e913accb04a2dbafb505f6809bf72103303d4f4948656a308052f2e56716962c2cdc44a0fa785721ff31cacc0937dd0a06fa0fcf1d3d22eb6c5
6
+ metadata.gz: 1aba836ab77005465669a51695f8eb6fb01ac76841eea6cff3e5202b9c8275eb7777bf0c0dc1ff2c5f623d6e981bc161dcb8689b19f985f74a2a86bfe0c0b84e
7
+ data.tar.gz: 8e134db0be9cc68e9effd93170fa931bf03787cdc57bb438842ee5399aab8f549f33ca90c7afbe462da7d50bf3c2dacc7ab6a01bbf3af6506d7b0848df05c3ed
data/.travis.yml CHANGED
@@ -24,3 +24,10 @@ gemfile:
24
24
  - gemfiles/rails41.gemfile
25
25
  - gemfiles/rails42.gemfile
26
26
  - gemfiles/rails42_protected_attributes.gemfile
27
+ - gemfiles/rails5.gemfile
28
+ matrix:
29
+ exclude:
30
+ - rvm: 2.1
31
+ gemfile: gemfiles/rails5.gemfile
32
+ - rvm: jruby-19mode
33
+ gemfile: gemfiles/rails5.gemfile
data/Appraisals CHANGED
@@ -29,3 +29,10 @@ appraise "rails42-protected_attributes" do
29
29
  gem "fastthread", :git => "git://github.com/zoltankiss/fastthread.git", :platforms => :mri_20
30
30
  gem "passenger", "~>3.0"
31
31
  end
32
+
33
+ appraise "rails5" do
34
+ gem "mocha", "~> 1.0", :require=>false
35
+ gem "rails", "5.0.0"
36
+ gem "fastthread", :git => "git://github.com/zoltankiss/fastthread.git", :platforms => :mri_20
37
+ gem "passenger", "~>3.0"
38
+ end
data/CHANGELOG CHANGED
@@ -1,4 +1,10 @@
1
- == 2.2.4 (2016-7-21)
1
+ == 2.2.6 (2016-10-04)
2
+ * Fixes for `Vanity.ab_test()` vs. view helper `ab_test` (@phillbaker)
3
+
4
+ == 2.2.5 (2016-9-23)
5
+ * Updates for rails5 compatbility (@phillbaker)
6
+
7
+ == 2.2.4 (2016-9-21)
2
8
  * Fix typo in template (@arthurxaud)
3
9
 
4
10
  == 2.2.3 (2016-6-25)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- vanity (2.2.4)
4
+ vanity (2.2.6)
5
5
  i18n
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -19,7 +19,9 @@ Vanity is an A/B testing framework for Rails that is datastore agnostic.
19
19
 
20
20
  Add to your Gemfile:
21
21
 
22
- gem "vanity"
22
+ ```ruby
23
+ gem "vanity"
24
+ ```
23
25
 
24
26
  (For support for older versions of Rails and Ruby 1.8, please see the [1.9.x
25
27
  branch](https://github.com/assaf/vanity/tree/1-9-stable).)
@@ -35,8 +37,10 @@ Datastores should be configured using a `config/vanity.yml`.
35
37
 
36
38
  Add to your Gemfile:
37
39
 
38
- gem "redis", ">= 2.1"
39
- gem "redis-namespace", ">= 1.1.0"
40
+ ```ruby
41
+ gem "redis", ">= 2.1"
42
+ gem "redis-namespace", ">= 1.1.0"
43
+ ```
40
44
 
41
45
  By default Vanity is configured to use Redis on localhost port 6379 with
42
46
  database 0.
@@ -62,7 +66,7 @@ test:
62
66
 
63
67
  To re-use an existing redis connection, you can call `Vanity.connect!` explicitly, for example:
64
68
 
65
- ```
69
+ ```ruby
66
70
  Vanity.connect!(
67
71
  adapter: :redis,
68
72
  redis: $redis
@@ -134,7 +138,7 @@ $ rake db:migrate
134
138
  If you're using a forking server (like Passenger or Unicorn), you should
135
139
  reconnect after a new worker is created:
136
140
 
137
- ```
141
+ ```ruby
138
142
  # unicorn.rb
139
143
  after_fork do |server, worker|
140
144
  defined?(Vanity) && Vanity.reconnect!
@@ -153,7 +157,7 @@ end
153
157
 
154
158
  If you're using explicit options with `Vanity.connect!`, you should call `disconnect!` first, for example:
155
159
 
156
- ```
160
+ ```ruby
157
161
  Vanity.disconnect!
158
162
  Vanity.connect!(
159
163
  adapter: 'redis',
@@ -294,8 +298,11 @@ Here's what's tested and known to work:
294
298
  Rails: 3.2, 4.1, 4.2
295
299
  Ruby 2.2
296
300
  Persistence: Redis, Mongo, ActiveRecord
297
- Rails: 3.2, 4.1, 4.2
301
+ Rails: 3.2, 4.1, 4.2, 5
298
302
  Ruby 2.3
303
+ Persistence: Redis, Mongo, ActiveRecord
304
+ Rails: 3.2, 4.1, 4.2, 5
305
+ JRuby 1.9
299
306
  Persistence: Redis, Mongo, ActiveRecord
300
307
  Rails: 3.2, 4.1, 4.2
301
308
 
data/Rakefile CHANGED
@@ -69,6 +69,7 @@ Rake::TestTask.new(:test) do |task|
69
69
  task.libs << "test"
70
70
  task.pattern = "test/**/*_test.rb"
71
71
  task.verbose = false
72
+ task.warning = false
72
73
  end
73
74
 
74
75
  task :default=>:test
data/bin/vanity CHANGED
@@ -3,7 +3,7 @@ if File.exist?("config/boot.rb") && File.exist?("config/environment.rb")
3
3
  require "./config/environment"
4
4
  else
5
5
  path = File.expand_path("../lib", File.dirname(__FILE__))
6
- $LOAD_PATH.unshift path unless $LOAD_PATH.include?(path)
6
+ $LOAD_PATH.unshift(path) unless $LOAD_PATH.include?(path)
7
7
  require "vanity"
8
8
  end
9
9
 
@@ -11,7 +11,7 @@ require "optparse"
11
11
 
12
12
  playground = Vanity.playground
13
13
  options = Struct.new(:output).new
14
- opts = OptionParser.new("", 24, " ") do |opts|
14
+ parser = OptionParser.new("", 24, " ") do |opts|
15
15
  opts.banner = "Usage: #{File.basename($0)} [options] command\n"
16
16
  opts.banner << "Commands:\n"
17
17
  opts.banner << " list List all experiments and metrics\n"
@@ -19,17 +19,17 @@ opts = OptionParser.new("", 24, " ") do |opts|
19
19
 
20
20
  opts.separator ""
21
21
  opts.separator "Reporting options:"
22
- opts.on "--output FILE", "Write report to this file (default: stdout)" do |path|
23
- options.output = path
22
+ opts.on "--output FILE", "Write report to this file (default: stdout)" do |report_path|
23
+ options.output = report_path
24
24
  end
25
25
 
26
26
  opts.separator ""
27
27
  opts.separator "Common options:"
28
- opts.on "--load_path PATH", "Path to experiments directory (default: #{playground.load_path})" do |path|
29
- playground.load_path = path
28
+ opts.on "--load_path PATH", "Path to experiments directory (default: #{playground.load_path})" do |load_path|
29
+ playground.load_path = load_path
30
30
  end
31
31
  opts.on "-d", "--database url", "Database connection URL (e.g. redis://localhost:6379)" do |conn|
32
- playground.establish_connection conn
32
+ playground.establish_connection(conn)
33
33
  end
34
34
  opts.on_tail "-h", "--help", "Show this message" do
35
35
  puts opts.to_s.gsub(/^.*DEPRECATED.*$/s, '')
@@ -41,9 +41,9 @@ opts = OptionParser.new("", 24, " ") do |opts|
41
41
  end
42
42
  end
43
43
 
44
- opts.parse!(ARGV)
44
+ parser.parse!(ARGV)
45
45
  if ARGV.empty?
46
- puts opts.banner
46
+ puts parser.banner
47
47
  exit
48
48
  end
49
49
 
@@ -7,7 +7,7 @@ GIT
7
7
  PATH
8
8
  remote: ..
9
9
  specs:
10
- vanity (2.2.4)
10
+ vanity (2.2.6)
11
11
  i18n
12
12
 
13
13
  GEM
@@ -52,6 +52,7 @@ GEM
52
52
  arel (3.0.3)
53
53
  blankslate (2.1.2.4)
54
54
  bson (4.0.2)
55
+ bson (4.0.2-java)
55
56
  builder (3.0.4)
56
57
  celluloid (0.16.0)
57
58
  timers (~> 4.0.0)
@@ -7,7 +7,7 @@ GIT
7
7
  PATH
8
8
  remote: .././
9
9
  specs:
10
- vanity (2.2.4)
10
+ vanity (2.2.6)
11
11
  i18n
12
12
 
13
13
  GEM
@@ -51,6 +51,7 @@ GEM
51
51
  arel (5.0.1.20140414130214)
52
52
  blankslate (2.1.2.4)
53
53
  bson (4.0.2)
54
+ bson (4.0.2-java)
54
55
  builder (3.2.2)
55
56
  celluloid (0.16.0)
56
57
  timers (~> 4.0.0)
@@ -7,7 +7,7 @@ GIT
7
7
  PATH
8
8
  remote: ..
9
9
  specs:
10
- vanity (2.2.4)
10
+ vanity (2.2.6)
11
11
  i18n
12
12
 
13
13
  GEM
@@ -60,6 +60,7 @@ GEM
60
60
  arel (6.0.0)
61
61
  blankslate (2.1.2.4)
62
62
  bson (4.0.2)
63
+ bson (4.0.2-java)
63
64
  builder (3.2.2)
64
65
  celluloid (0.16.0)
65
66
  timers (~> 4.0.0)
@@ -7,7 +7,7 @@ GIT
7
7
  PATH
8
8
  remote: ../
9
9
  specs:
10
- vanity (2.2.4)
10
+ vanity (2.2.6)
11
11
  i18n
12
12
 
13
13
  GEM
@@ -0,0 +1,33 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rack"
6
+ gem "redis", ">= 2.1"
7
+ gem "redis-namespace", ">= 1.1.0"
8
+ gem "mongo", "~> 2.1"
9
+ gem "integration", "<= 0.1.0"
10
+ gem "rubystats", ">= 0.2.5"
11
+ gem "garb", "< 0.9.2", :require => false
12
+ gem "mocha", "~> 1.0", :require => false
13
+ gem "rails", "5.0.0"
14
+ gem "fastthread", :git => "git://github.com/zoltankiss/fastthread.git", :platforms => :mri_20
15
+ gem "passenger", "~>3.0"
16
+
17
+ group :development do
18
+ gem "rake"
19
+ gem "RedCloth"
20
+ gem "yard"
21
+ end
22
+
23
+ platforms :ruby do
24
+ gem "sqlite3", "~> 1.3.10"
25
+ gem "jekyll", "~> 2.5.3"
26
+ end
27
+
28
+ platforms :jruby do
29
+ gem "activerecord-jdbc-adapter"
30
+ gem "jdbc-sqlite3"
31
+ end
32
+
33
+ gemspec :development_group => :test, :path => "../"
@@ -0,0 +1,256 @@
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.2.6)
11
+ i18n
12
+
13
+ GEM
14
+ remote: https://rubygems.org/
15
+ specs:
16
+ RedCloth (4.3.0)
17
+ actioncable (5.0.0)
18
+ actionpack (= 5.0.0)
19
+ nio4r (~> 1.2)
20
+ websocket-driver (~> 0.6.1)
21
+ actionmailer (5.0.0)
22
+ actionpack (= 5.0.0)
23
+ actionview (= 5.0.0)
24
+ activejob (= 5.0.0)
25
+ mail (~> 2.5, >= 2.5.4)
26
+ rails-dom-testing (~> 2.0)
27
+ actionpack (5.0.0)
28
+ actionview (= 5.0.0)
29
+ activesupport (= 5.0.0)
30
+ rack (~> 2.0)
31
+ rack-test (~> 0.6.3)
32
+ rails-dom-testing (~> 2.0)
33
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
34
+ actionview (5.0.0)
35
+ activesupport (= 5.0.0)
36
+ builder (~> 3.1)
37
+ erubis (~> 2.7.0)
38
+ rails-dom-testing (~> 2.0)
39
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
40
+ activejob (5.0.0)
41
+ activesupport (= 5.0.0)
42
+ globalid (>= 0.3.6)
43
+ activemodel (5.0.0)
44
+ activesupport (= 5.0.0)
45
+ activerecord (5.0.0)
46
+ activemodel (= 5.0.0)
47
+ activesupport (= 5.0.0)
48
+ arel (~> 7.0)
49
+ activesupport (5.0.0)
50
+ concurrent-ruby (~> 1.0, >= 1.0.2)
51
+ i18n (~> 0.7)
52
+ minitest (~> 5.1)
53
+ tzinfo (~> 1.1)
54
+ addressable (2.4.0)
55
+ appraisal (1.0.3)
56
+ bundler
57
+ rake
58
+ thor (>= 0.14.0)
59
+ arel (7.0.0)
60
+ blankslate (2.1.2.4)
61
+ bson (4.1.1)
62
+ builder (3.2.2)
63
+ classifier-reborn (2.0.4)
64
+ fast-stemmer (~> 1.0)
65
+ coderay (1.1.1)
66
+ coffee-script (2.4.1)
67
+ coffee-script-source
68
+ execjs
69
+ coffee-script-source (1.10.0)
70
+ colorator (0.1)
71
+ concurrent-ruby (1.0.2)
72
+ crack (0.4.3)
73
+ safe_yaml (~> 1.0.0)
74
+ daemon_controller (1.2.0)
75
+ erubis (2.7.0)
76
+ execjs (2.6.0)
77
+ fakefs (0.8.1)
78
+ faraday (0.9.2)
79
+ multipart-post (>= 1.2, < 3)
80
+ fast-stemmer (1.0.2)
81
+ ffi (1.9.10)
82
+ garb (0.9.1)
83
+ activesupport (>= 2.2.0)
84
+ crack (>= 0.1.6)
85
+ globalid (0.3.6)
86
+ activesupport (>= 4.1.0)
87
+ hashdiff (0.3.0)
88
+ i18n (0.7.0)
89
+ integration (0.1.0)
90
+ jekyll (2.5.3)
91
+ classifier-reborn (~> 2.0)
92
+ colorator (~> 0.1)
93
+ jekyll-coffeescript (~> 1.0)
94
+ jekyll-gist (~> 1.0)
95
+ jekyll-paginate (~> 1.0)
96
+ jekyll-sass-converter (~> 1.0)
97
+ jekyll-watch (~> 1.1)
98
+ kramdown (~> 1.3)
99
+ liquid (~> 2.6.1)
100
+ mercenary (~> 0.3.3)
101
+ pygments.rb (~> 0.6.0)
102
+ redcarpet (~> 3.1)
103
+ safe_yaml (~> 1.0)
104
+ toml (~> 0.1.0)
105
+ jekyll-coffeescript (1.0.1)
106
+ coffee-script (~> 2.2)
107
+ jekyll-gist (1.4.0)
108
+ octokit (~> 4.2)
109
+ jekyll-paginate (1.1.0)
110
+ jekyll-sass-converter (1.4.0)
111
+ sass (~> 3.4)
112
+ jekyll-watch (1.4.0)
113
+ listen (~> 3.0, < 3.1)
114
+ kramdown (1.11.1)
115
+ liquid (2.6.3)
116
+ listen (3.0.7)
117
+ rb-fsevent (>= 0.9.3)
118
+ rb-inotify (>= 0.9.7)
119
+ loofah (2.0.3)
120
+ nokogiri (>= 1.5.9)
121
+ mail (2.6.4)
122
+ mime-types (>= 1.16, < 4)
123
+ mercenary (0.3.6)
124
+ metaclass (0.0.4)
125
+ method_source (0.8.2)
126
+ mime-types (3.1)
127
+ mime-types-data (~> 3.2015)
128
+ mime-types-data (3.2016.0521)
129
+ mini_portile2 (2.1.0)
130
+ minitest (5.9.0)
131
+ mocha (1.1.0)
132
+ metaclass (~> 0.0.1)
133
+ mongo (2.2.5)
134
+ bson (~> 4.0)
135
+ multipart-post (2.0.0)
136
+ nio4r (1.2.1)
137
+ nokogiri (1.6.8)
138
+ mini_portile2 (~> 2.1.0)
139
+ pkg-config (~> 1.1.7)
140
+ octokit (4.3.0)
141
+ sawyer (~> 0.7.0, >= 0.5.3)
142
+ parslet (1.5.0)
143
+ blankslate (~> 2.0)
144
+ passenger (3.0.21)
145
+ daemon_controller (>= 1.0.0)
146
+ fastthread (>= 1.0.1)
147
+ rack
148
+ rake (>= 0.8.1)
149
+ pkg-config (1.1.7)
150
+ posix-spawn (0.3.11)
151
+ pry (0.10.3)
152
+ coderay (~> 1.1.0)
153
+ method_source (~> 0.8.1)
154
+ slop (~> 3.4)
155
+ pygments.rb (0.6.3)
156
+ posix-spawn (~> 0.3.6)
157
+ yajl-ruby (~> 1.2.0)
158
+ rack (2.0.1)
159
+ rack-test (0.6.3)
160
+ rack (>= 1.0)
161
+ rails (5.0.0)
162
+ actioncable (= 5.0.0)
163
+ actionmailer (= 5.0.0)
164
+ actionpack (= 5.0.0)
165
+ actionview (= 5.0.0)
166
+ activejob (= 5.0.0)
167
+ activemodel (= 5.0.0)
168
+ activerecord (= 5.0.0)
169
+ activesupport (= 5.0.0)
170
+ bundler (>= 1.3.0, < 2.0)
171
+ railties (= 5.0.0)
172
+ sprockets-rails (>= 2.0.0)
173
+ rails-dom-testing (2.0.1)
174
+ activesupport (>= 4.2.0, < 6.0)
175
+ nokogiri (~> 1.6.0)
176
+ rails-html-sanitizer (1.0.3)
177
+ loofah (~> 2.0)
178
+ railties (5.0.0)
179
+ actionpack (= 5.0.0)
180
+ activesupport (= 5.0.0)
181
+ method_source
182
+ rake (>= 0.8.7)
183
+ thor (>= 0.18.1, < 2.0)
184
+ rake (11.2.2)
185
+ rb-fsevent (0.9.7)
186
+ rb-inotify (0.9.7)
187
+ ffi (>= 0.5.0)
188
+ redcarpet (3.3.4)
189
+ redis (3.3.0)
190
+ redis-namespace (1.5.2)
191
+ redis (~> 3.0, >= 3.0.4)
192
+ rubystats (0.2.5)
193
+ safe_yaml (1.0.4)
194
+ sass (3.4.22)
195
+ sawyer (0.7.0)
196
+ addressable (>= 2.3.5, < 2.5)
197
+ faraday (~> 0.8, < 0.10)
198
+ slop (3.6.0)
199
+ sprockets (3.6.3)
200
+ concurrent-ruby (~> 1.0)
201
+ rack (> 1, < 3)
202
+ sprockets-rails (3.1.1)
203
+ actionpack (>= 4.0)
204
+ activesupport (>= 4.0)
205
+ sprockets (>= 3.0.0)
206
+ sqlite3 (1.3.11)
207
+ thor (0.19.1)
208
+ thread_safe (0.3.5)
209
+ timecop (0.8.1)
210
+ toml (0.1.2)
211
+ parslet (~> 1.5.0)
212
+ tzinfo (1.2.2)
213
+ thread_safe (~> 0.1)
214
+ webmock (2.0.1)
215
+ addressable (>= 2.3.6)
216
+ crack (>= 0.3.2)
217
+ hashdiff
218
+ websocket-driver (0.6.4)
219
+ websocket-extensions (>= 0.1.0)
220
+ websocket-extensions (0.1.2)
221
+ yajl-ruby (1.2.1)
222
+ yard (0.8.7.6)
223
+
224
+ PLATFORMS
225
+ ruby
226
+
227
+ DEPENDENCIES
228
+ RedCloth
229
+ activerecord-jdbc-adapter
230
+ appraisal (~> 1.0.2)
231
+ bundler (>= 1.8.0)
232
+ fakefs
233
+ fastthread!
234
+ garb (< 0.9.2)
235
+ integration (<= 0.1.0)
236
+ jdbc-sqlite3
237
+ jekyll (~> 2.5.3)
238
+ minitest (>= 4.2)
239
+ mocha (~> 1.0)
240
+ mongo (~> 2.1)
241
+ passenger (~> 3.0)
242
+ pry
243
+ rack
244
+ rails (= 5.0.0)
245
+ rake
246
+ redis (>= 2.1)
247
+ redis-namespace (>= 1.1.0)
248
+ rubystats (>= 0.2.5)
249
+ sqlite3 (~> 1.3.10)
250
+ timecop
251
+ vanity!
252
+ webmock
253
+ yard
254
+
255
+ BUNDLED WITH
256
+ 1.10.6
@@ -91,7 +91,7 @@ module Vanity
91
91
  end
92
92
 
93
93
  def destroy_metric(metric)
94
- @metrics.del *@metrics.keys("#{metric}:*")
94
+ @metrics.del(*@metrics.keys("#{metric}:*"))
95
95
  end
96
96
 
97
97
 
@@ -221,7 +221,7 @@ module Vanity
221
221
  def destroy_experiment(experiment)
222
222
  @experiments.del "#{experiment}:outcome", "#{experiment}:created_at", "#{experiment}:completed_at"
223
223
  alternatives = @experiments.keys("#{experiment}:alts:*")
224
- @experiments.del *alternatives unless alternatives.empty?
224
+ @experiments.del(*alternatives) unless alternatives.empty?
225
225
  end
226
226
 
227
227
  protected
@@ -62,7 +62,7 @@ module Vanity
62
62
 
63
63
  def current_rake_tasks
64
64
  ::Rake.application.top_level_tasks
65
- rescue => e
65
+ rescue
66
66
  []
67
67
  end
68
68
  end
@@ -208,7 +208,7 @@ module Vanity
208
208
  file_name ||= config_file
209
209
  file_path = File.join(config_path, file_name)
210
210
 
211
- if File.exists?(file_path)
211
+ if File.exist?(file_path)
212
212
  config = YAML.load(ERB.new(File.read(file_path)).result)
213
213
  config ||= {}
214
214
  params_for_environment = config[environment.to_s]
@@ -460,7 +460,7 @@ module Vanity
460
460
  # end
461
461
  def outcome_is(&block)
462
462
  raise ArgumentError, "Missing block" unless block
463
- raise "outcome_is already called on this experiment" if @outcome_is
463
+ raise "outcome_is already called on this experiment" if defined?(@outcome_is)
464
464
  @outcome_is = block
465
465
  end
466
466
 
@@ -478,7 +478,7 @@ module Vanity
478
478
  super
479
479
 
480
480
  unless outcome
481
- if @outcome_is
481
+ if defined?(@outcome_is)
482
482
  begin
483
483
  result = @outcome_is.call
484
484
  outcome = result.id if Alternative === result && result.experiment == self
@@ -511,26 +511,18 @@ module Vanity
511
511
  self
512
512
  end
513
513
 
514
- # clears all collected data for the experiment
515
- def reset
516
- connection.destroy_experiment(@id)
517
- connection.set_experiment_created_at(@id, Time.now)
518
- @outcome = @completed_at = nil
519
- self
520
- end
521
-
522
514
  # Set up tracking for metrics and ensure that the attributes of the ab_test
523
515
  # are valid (e.g. has alternatives, has a default, has metrics).
524
516
  # If collecting, this method will also store this experiment into the db.
525
517
  # In most cases, you call this method right after the experiment's been instantiated
526
518
  # and declared.
527
519
  def save
528
- if @saved
520
+ if defined?(@saved)
529
521
  Vanity.logger.warn("Experiment #{name} has already been saved")
530
522
  return
531
523
  end
532
524
  @saved = true
533
- true_false unless @alternatives
525
+ true_false unless defined?(@alternatives)
534
526
  fail "Experiment #{name} needs at least two alternatives" unless @alternatives.size >= 2
535
527
  if !@is_default_set
536
528
  default(@alternatives.first)
@@ -542,10 +534,10 @@ module Vanity
542
534
  @default = @alternatives.first
543
535
  end
544
536
  super
545
- if @metrics.nil? || @metrics.empty?
537
+ if !defined?(@metrics) || @metrics.nil? || @metrics.empty?
546
538
  Vanity.logger.warn("Please use metrics method to explicitly state which metric you are measuring against.")
547
- metric = @playground.metrics[id] ||= Vanity::Metric.new(@playground, name)
548
- @metrics = [metric]
539
+ default_metric = @playground.metrics[id] ||= Vanity::Metric.new(@playground, name)
540
+ @metrics = [default_metric]
549
541
  end
550
542
  @metrics.each do |metric|
551
543
  metric.hook(&method(:track!))
@@ -636,12 +628,12 @@ module Vanity
636
628
 
637
629
  def filter_visitor?(request, identity)
638
630
  @playground.request_filter.call(request) ||
639
- (@request_filter_block && @request_filter_block.call(request, identity))
631
+ (defined?(@request_filter_block) && @request_filter_block && @request_filter_block.call(request, identity))
640
632
  end
641
633
 
642
634
  def call_on_assignment_if_available(identity, index)
643
635
  # if we have an on_assignment block, call it on new assignments
644
- if @on_assignment_block
636
+ if defined?(@on_assignment_block) && @on_assignment_block
645
637
  assignment = alternatives[index]
646
638
  if !connection.ab_seen @id, identity, assignment
647
639
  @on_assignment_block.call(Vanity.context, identity, assignment, self)
@@ -651,7 +643,7 @@ module Vanity
651
643
 
652
644
  def rebalance_if_necessary!
653
645
  # if we are rebalancing probabilities, keep track of how long it has been since we last rebalanced
654
- if @rebalance_frequency
646
+ if defined?(@rebalance_frequency) && @rebalance_frequency
655
647
  @assignments_since_rebalancing += 1
656
648
  if @assignments_since_rebalancing >= @rebalance_frequency
657
649
  @assignments_since_rebalancing = 0
@@ -661,7 +653,7 @@ module Vanity
661
653
  end
662
654
 
663
655
  def has_alternative_weights?(args)
664
- @alternatives.nil? && args.size == 1 && args[0].is_a?(Hash)
656
+ (!defined?(@alternatives) || @alternatives.nil?) && args.size == 1 && args[0].is_a?(Hash)
665
657
  end
666
658
 
667
659
  def build_alternatives_with_weights(args)
@@ -688,10 +680,10 @@ module Vanity
688
680
  end
689
681
 
690
682
  begin
691
- a = 50.0
683
+ avg = 50.0
692
684
  # Returns array of [z-score, percentage]
693
685
  norm_dist = []
694
- (0.0..3.1).step(0.01) { |x| norm_dist << [x, a += 1 / Math.sqrt(2 * Math::PI) * Math::E ** (-x ** 2 / 2)] }
686
+ (0.0..3.1).step(0.01) { |x| norm_dist << [x, avg += 1 / Math.sqrt(2 * Math::PI) * Math::E ** (-x ** 2 / 2)] }
695
687
  # We're really only interested in 90%, 95%, 99% and 99.9%.
696
688
  Z_TO_PROBABILITY = [90, 95, 99, 99.9].map { |pct| [norm_dist.find { |x,a| a >= pct }.first, pct] }.reverse
697
689
  end
@@ -25,21 +25,21 @@ module Vanity
25
25
 
26
26
  # Number of participants who viewed this alternative.
27
27
  def participants
28
- load_counts unless @participants
28
+ load_counts unless defined?(@participants)
29
29
  @participants
30
30
  end
31
31
 
32
32
  # Number of participants who converted on this alternative (a
33
33
  # participant is counted only once).
34
34
  def converted
35
- load_counts unless @converted
35
+ load_counts unless defined?(@converted)
36
36
  @converted
37
37
  end
38
38
 
39
39
  # Number of conversions for this alternative (same participant may be
40
40
  # counted more than once).
41
41
  def conversions
42
- load_counts unless @conversions
42
+ load_counts unless defined?(@conversions)
43
43
  @conversions
44
44
  end
45
45
 
@@ -59,9 +59,6 @@ module Vanity
59
59
  @created_at ||= connection.get_experiment_created_at(@id)
60
60
  end
61
61
 
62
- # Time stamp when experiment was completed.
63
- attr_reader :completed_at
64
-
65
62
  # Returns the type of this experiment as a symbol (e.g. :ab_test).
66
63
  def type
67
64
  self.class.type
@@ -109,7 +106,7 @@ module Vanity
109
106
  # puts "Just defined: " + experiment(:simple).description
110
107
  def description(text = nil)
111
108
  @description = text if text
112
- @description
109
+ @description if defined?(@description)
113
110
  end
114
111
 
115
112
 
@@ -121,7 +118,7 @@ module Vanity
121
118
  # end
122
119
  def complete_if(&block)
123
120
  raise ArgumentError, "Missing block" unless block
124
- raise "complete_if already called on this experiment" if @complete_block
121
+ raise "complete_if already called on this experiment" if defined?(@complete_block)
125
122
  @complete_block = block
126
123
  end
127
124
 
@@ -188,7 +185,7 @@ module Vanity
188
185
  # Derived classes call this after state changes that may lead to
189
186
  # experiment completing.
190
187
  def check_completion!
191
- if @complete_block
188
+ if defined?(@complete_block) && @complete_block
192
189
  begin
193
190
  complete! if @complete_block.call
194
191
  rescue => e
@@ -17,7 +17,7 @@ module Vanity
17
17
  fail "Experiment #{@experiment_id} already defined in playground" if playground.experiments[@experiment_id]
18
18
  klass = Experiment.const_get(type.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase })
19
19
  experiment = klass.new(playground, @experiment_id, name, options)
20
- experiment.instance_eval &block
20
+ experiment.instance_eval(&block)
21
21
  experiment.save
22
22
  playground.experiments[@experiment_id] = experiment
23
23
  end
@@ -41,12 +41,6 @@ module Vanity
41
41
  # use_vanity { |controller| controller.params[:project_id] }
42
42
  # end
43
43
  def use_vanity(method_name = nil, &block)
44
- define_method :vanity_store_experiment_for_js do |name, alternative|
45
- @_vanity_experiments ||= {}
46
- @_vanity_experiments[name] ||= alternative
47
- @_vanity_experiments[name].value
48
- end
49
-
50
44
  define_method(:vanity_identity_block) { block }
51
45
  define_method(:vanity_identity_method) { method_name }
52
46
 
@@ -61,7 +55,7 @@ module Vanity
61
55
  module Identity
62
56
  def vanity_identity # :nodoc:
63
57
  return vanity_identity_block.call(self) if vanity_identity_block
64
- return @vanity_identity if @vanity_identity
58
+ return @vanity_identity if defined?(@vanity_identity) && @vanity_identity
65
59
 
66
60
  # With user sign in, it's possible to visit not-logged in, get
67
61
  # cookied and shown alternative A, then sign in and based on
@@ -162,20 +156,22 @@ module Vanity
162
156
  # :null_abc experiment is chosen and the user redirected to
163
157
  # http://example.com/.
164
158
  def vanity_query_parameter_filter
165
- if request.get? && params[:_vanity]
166
- hashes = Array(params.delete(:_vanity))
159
+ query_params = request.query_parameters
160
+ if request.get? && query_params[:_vanity]
161
+ hashes = Array(query_params.delete(:_vanity))
167
162
  Vanity.playground.experiments.each do |id, experiment|
168
163
  if experiment.respond_to?(:alternatives)
169
164
  experiment.alternatives.each do |alt|
170
- if hash = hashes.delete(experiment.fingerprint(alt))
171
- experiment.chooses alt.value
165
+ if hashes.delete(experiment.fingerprint(alt))
166
+ experiment.chooses(alt.value)
172
167
  break
173
168
  end
174
169
  end
175
170
  end
176
171
  break if hashes.empty?
177
172
  end
178
- redirect_to url_for(params)
173
+ path_parts = [url_for, query_params.to_query]
174
+ redirect_to(path_parts.join('?'))
179
175
  end
180
176
  end
181
177
 
@@ -224,7 +220,8 @@ module Vanity
224
220
  # <%= count %> features to choose from!
225
221
  # <% end %>
226
222
  def ab_test(name, &block)
227
- value = setup_experiment(name)
223
+ current_request = respond_to?(:request) ? self.request : nil
224
+ value = Vanity.ab_test(name, current_request)
228
225
 
229
226
  if block
230
227
  content = capture(value, &block)
@@ -251,7 +248,7 @@ module Vanity
251
248
  end
252
249
 
253
250
  def vanity_js
254
- return if @_vanity_experiments.nil? || @_vanity_experiments.empty?
251
+ return if Vanity.context.vanity_active_experiments.nil? || Vanity.context.vanity_active_experiments.empty?
255
252
  javascript_tag do
256
253
  render :file => Vanity.template("_vanity"), :formats => [:js]
257
254
  end
@@ -291,25 +288,14 @@ module Vanity
291
288
  # </script>
292
289
  # <% end %>
293
290
  def vanity_experiments
294
- @_vanity_experiments ||= {}
295
- experiments = {}
291
+ edit_safe_experiments = {}
296
292
 
297
- @_vanity_experiments.each do |name, alternative|
298
- experiments[name] = alternative.clone
293
+ Vanity.context.vanity_active_experiments.each do |name, alternative|
294
+ edit_safe_experiments[name] = alternative.clone
299
295
  end
300
296
 
301
- experiments
302
- end
303
-
304
- protected
305
-
306
- def setup_experiment(name)
307
- @_vanity_experiments ||= {}
308
- request = respond_to?(:request) ? self.request : nil
309
- @_vanity_experiments[name] ||= Vanity.playground.experiment(name.to_sym).choose(request)
310
- @_vanity_experiments[name].value
297
+ edit_safe_experiments
311
298
  end
312
-
313
299
  end
314
300
 
315
301
 
@@ -1,5 +1,5 @@
1
1
  module Vanity
2
- # Helper methods available on Object.
2
+ # Helper methods available on the Vanity module.
3
3
  #
4
4
  # @example From ERB template
5
5
  # <%= ab_test(:greeting) %> <%= current_user.name %>
@@ -17,7 +17,6 @@ module Vanity
17
17
  # end
18
18
  # end
19
19
  module Helpers
20
-
21
20
  # This method returns one of the alternative values in the named A/B test.
22
21
  #
23
22
  # @example A/B two alternatives for a page
@@ -33,21 +32,15 @@ module Vanity
33
32
  # render action: Vanity.ab_test(:new_page)
34
33
  # end
35
34
  # @since 1.2.0
36
- def ab_test(name, &block)
37
- # TODO refactor with Vanity::Rails::Helpers#ab_test, however that's used
38
- # within Rails views
39
- request = respond_to?(:request) ? self.request : nil
40
- if Vanity.playground.using_js?
41
- value = Vanity.context.vanity_store_experiment_for_js name, Vanity.playground.experiment(name).choose(request)
42
- else
43
- value = Vanity.playground.experiment(name).choose(request).value
44
- end
35
+ def ab_test(name, request=nil, &block)
36
+ request ||= Vanity.context.respond_to?(:request) ? Vanity.context.request : nil
37
+
38
+ alternative = Vanity.playground.experiment(name).choose(request)
39
+ Vanity.context.vanity_add_to_active_experiments(name, alternative)
40
+
41
+ Vanity.logger.warn("Deprecated: This method used to accept a block, however, calling it with a block would result in an exception. The block will be removed from the signature in an upcoming version.") if block
45
42
 
46
- if block
47
- content = capture(value, &block)
48
- else
49
- value
50
- end
43
+ alternative.value
51
44
  end
52
45
 
53
46
  # Tracks an action associated with a metric. Useful for calling from a
@@ -64,7 +57,7 @@ module Vanity
64
57
  # of options passed (eventually) to AbTest#track!.
65
58
  # @since 1.2.0
66
59
  def track!(name, count_or_options = 1)
67
- Vanity.playground.track! name, count_or_options
60
+ Vanity.playground.track!(name, count_or_options)
68
61
  end
69
62
  end
70
63
  end
@@ -88,7 +88,7 @@ module Vanity
88
88
  # This track! method stores nothing, but calls the hooks.
89
89
  def track!(args = nil)
90
90
  return unless @playground.collecting?
91
- call_hooks *track_args(args)
91
+ call_hooks(*track_args(args))
92
92
  end
93
93
 
94
94
  def last_update_at
@@ -27,7 +27,7 @@ module Vanity
27
27
  def metric(name, &block)
28
28
  fail "Metric #{@metric_id} already defined in playground" if playground.metrics[@metric_id]
29
29
  metric = Metric.new(playground, name.to_s, @metric_id)
30
- metric.instance_eval &block
30
+ metric.instance_eval(&block)
31
31
  playground.metrics[@metric_id] = metric
32
32
  end
33
33
 
@@ -191,7 +191,7 @@ module Vanity
191
191
  alias :to_s :name
192
192
 
193
193
  # Human readable description. Use two newlines to break paragraphs.
194
- attr_accessor :description
194
+ attr_writer :description
195
195
 
196
196
  # Sets or returns description. For example
197
197
  # metric "Yawns/sec" do
@@ -201,7 +201,7 @@ module Vanity
201
201
  # puts "Just defined: " + metric(:boring).description
202
202
  def description(text = nil)
203
203
  @description = text if text
204
- @description
204
+ @description if defined?(@description)
205
205
  end
206
206
 
207
207
  # Given two arguments, a start date and an end date (inclusive), returns an
@@ -23,7 +23,7 @@ module Vanity
23
23
  # dotfiles in the directory.
24
24
  def custom_template_path_valid?
25
25
  Vanity.playground.custom_templates_path &&
26
- File.exists?(Vanity.playground.custom_templates_path) &&
26
+ File.exist?(Vanity.playground.custom_templates_path) &&
27
27
  !Dir[File.join(Vanity.playground.custom_templates_path, '*')].empty?
28
28
  end
29
29
 
@@ -1,5 +1,5 @@
1
1
  var httpRequest;
2
- var params = "v=<%= @_vanity_experiments.map{|name, alternative| "#{name}=#{alternative.id}" }.join(',') %>&authenticity_token=<%= CGI.escape(form_authenticity_token) %>";
2
+ var params = "v=<%= Vanity.context.vanity_active_experiments.map{|name, alternative| "#{name}=#{alternative.id}" }.join(',') %>&authenticity_token=<%= CGI.escape(form_authenticity_token) %>";
3
3
  if (window.XMLHttpRequest) { // Mozilla, Safari, ...
4
4
  httpRequest = new XMLHttpRequest();
5
5
  } else if (window.ActiveXObject) { // IE
data/lib/vanity/vanity.rb CHANGED
@@ -9,7 +9,7 @@ module Vanity
9
9
  # @see Vanity::Configuration
10
10
  # @since 2.0.0
11
11
  def self.configuration(set_if_needed=true)
12
- if @configuration
12
+ if defined?(@configuration) && @configuration
13
13
  @configuration
14
14
  elsif set_if_needed
15
15
  configure!
@@ -53,6 +53,21 @@ module Vanity
53
53
  # set by the set_vanity_context before filter (via Vanity::Rails#use_vanity).
54
54
  def self.context=(context)
55
55
  Thread.current[:vanity_context] = context
56
+
57
+ if context
58
+ context.class.send(:define_method, :vanity_add_to_active_experiments) do |name, alternative|
59
+ @_vanity_experiments ||= {}
60
+ @_vanity_experiments[name] ||= alternative
61
+ @_vanity_experiments[name].value
62
+ end
63
+ context.class.send(:alias_method, :vanity_store_experiment_for_js, :vanity_add_to_active_experiments)
64
+
65
+ context.class.send(:define_method, :vanity_active_experiments) do
66
+ @_vanity_experiments ||= {}
67
+ end
68
+ end
69
+
70
+ context
56
71
  end
57
72
 
58
73
  #
@@ -63,7 +78,7 @@ module Vanity
63
78
  #
64
79
  # @since 2.0.0
65
80
  def self.connection(connect_if_needed=true)
66
- if @connection
81
+ if defined?(@connection) && @connection
67
82
  @connection
68
83
  elsif connect_if_needed
69
84
  connect!
@@ -1,5 +1,5 @@
1
1
  module Vanity
2
- VERSION = "2.2.4"
2
+ VERSION = "2.2.6"
3
3
 
4
4
  module Version
5
5
  version = VERSION.to_s.split(".").map { |i| i.to_i }
@@ -8,7 +8,8 @@ class UseVanityController < ActionController::Base
8
8
  attr_accessor :current_user
9
9
 
10
10
  def index
11
- render :text=>Vanity.ab_test(:pie_or_cake)
11
+ text = Vanity.ab_test(:pie_or_cake)
12
+ render :plain=>text, :text=>text
12
13
  end
13
14
 
14
15
  def js
@@ -16,6 +17,20 @@ class UseVanityController < ActionController::Base
16
17
  render :inline => "<%= vanity_js -%>"
17
18
  end
18
19
 
20
+ def view_helper_ab_test_js
21
+ render :inline => <<-EOS
22
+ <% ab_test(:pie_or_cake) %>
23
+ <%= vanity_js -%>
24
+ EOS
25
+ end
26
+
27
+ def global_ab_test_js
28
+ render :inline => <<-EOS
29
+ <% Vanity.ab_test(:pie_or_cake) %>
30
+ <%= vanity_js -%>
31
+ EOS
32
+ end
33
+
19
34
  def model_js
20
35
  TestModel.new.test_method
21
36
  render :inline => "<%= vanity_js -%>"
@@ -5,7 +5,8 @@ class AbTestController < ActionController::Base
5
5
  attr_accessor :current_user
6
6
 
7
7
  def test_render
8
- render :text=>Vanity.ab_test(:simple)
8
+ text = Vanity.ab_test(:simple)
9
+ render :plain=>text, :text=>text
9
10
  end
10
11
 
11
12
  def test_view
@@ -18,7 +19,7 @@ class AbTestController < ActionController::Base
18
19
 
19
20
  def track
20
21
  Vanity.track!(:coolness)
21
- render :text=>""
22
+ render :plain=>"", :text=>""
22
23
  end
23
24
  end
24
25
 
@@ -604,7 +605,7 @@ class AbTestTest < ActionController::TestCase
604
605
  end
605
606
  class <<experiment(:foobar)
606
607
  def times_called
607
- @times_called || 0
608
+ @times_called ||= 0
608
609
  end
609
610
  def rebalance!
610
611
  @times_called = times_called + 1
@@ -801,6 +802,7 @@ class AbTestTest < ActionController::TestCase
801
802
  def test_ab_test_chooses_in_render
802
803
  new_ab_test :simple do
803
804
  metrics :coolness
805
+ identify { rand }
804
806
  default false
805
807
  end
806
808
  responses = Array.new(100) do
@@ -814,6 +816,7 @@ class AbTestTest < ActionController::TestCase
814
816
  def test_ab_test_chooses_view_helper
815
817
  new_ab_test :simple do
816
818
  metrics :coolness
819
+ identify { rand }
817
820
  default false
818
821
  end
819
822
  responses = Array.new(100) do
@@ -827,6 +830,7 @@ class AbTestTest < ActionController::TestCase
827
830
  def test_ab_test_with_capture
828
831
  new_ab_test :simple do
829
832
  metrics :coolness
833
+ identify { rand }
830
834
  default false
831
835
  end
832
836
  responses = Array.new(100) do
@@ -883,13 +887,13 @@ class AbTestTest < ActionController::TestCase
883
887
  default :a
884
888
  metrics :coolness
885
889
  end
886
- responses = Array.new(100) { |i|
890
+ responses = Array.new(100) do |i|
887
891
  @controller = nil ; setup_controller_request_and_response
888
892
  experiment(:simple).chooses(:b)
889
893
  experiment(:simple).chooses(nil)
890
894
  get :test_render
891
895
  @response.body
892
- }
896
+ end
893
897
  assert responses.uniq.size == 3
894
898
  end
895
899
 
@@ -34,6 +34,18 @@ class UseVanityControllerTest < ActionController::TestCase
34
34
  assert_match /script.*v=pie_or_cake=.*script/m, @response.body
35
35
  end
36
36
 
37
+ def test_view_helper_ab_test_js_for_tests
38
+ Vanity.playground.use_js!
39
+ get :view_helper_ab_test_js
40
+ assert_match /script.*v=pie_or_cake=.*script/m, @response.body
41
+ end
42
+
43
+ def test_global_ab_test_js_for_tests
44
+ Vanity.playground.use_js!
45
+ get :global_ab_test_js
46
+ assert_match /script.*v=pie_or_cake=.*script/m, @response.body
47
+ end
48
+
37
49
  def test_render_model_js_for_tests
38
50
  Vanity.playground.use_js!
39
51
  get :model_js
@@ -5,6 +5,7 @@ class RailsHelperTest < ActionView::TestCase
5
5
 
6
6
  def setup
7
7
  super
8
+ Vanity.context = self
8
9
  metric :sugar_high
9
10
  new_ab_test :pie_or_cake do
10
11
  metrics :sugar_high
data/test/test_helper.rb CHANGED
@@ -31,7 +31,7 @@ require "webmock/minitest"
31
31
  require 'vanity/frameworks/rails'
32
32
  Vanity::Rails.load!
33
33
 
34
- if $VERBOSE
34
+ if $DEBUG
35
35
  $logger = Logger.new(STDOUT)
36
36
  $logger.level = Logger::DEBUG
37
37
  else
@@ -119,7 +119,7 @@ module VanityTestHelpers
119
119
  enable = options.fetch(:enable, true)
120
120
  id = name.to_s.downcase.gsub(/\W/, "_").to_sym
121
121
  experiment = Vanity::Experiment::AbTest.new(Vanity.playground, id, name)
122
- experiment.instance_eval &block if block
122
+ experiment.instance_eval(&block) if block
123
123
  experiment.save
124
124
  # new experiments start off as disabled, enable them for testing
125
125
  experiment.enabled = true if enable
@@ -140,7 +140,12 @@ module VanityTestHelpers
140
140
  end
141
141
 
142
142
  def dummy_request
143
- ActionDispatch::TestRequest.new()
143
+ # Rails 5 compatibility
144
+ if ActionDispatch::TestRequest.respond_to?(:create)
145
+ ActionDispatch::TestRequest.create()
146
+ else
147
+ ActionDispatch::TestRequest.new()
148
+ end
144
149
  end
145
150
 
146
151
  # Defining setup/tear down in a module and including it below doesn't
@@ -194,6 +199,11 @@ if defined?(ActionController::TestCase)
194
199
  end
195
200
  end
196
201
 
202
+ if defined?(ActionDispatch::IntegrationTest)
203
+ class ActionDispatch::IntegrationTest
204
+ end
205
+ end
206
+
197
207
  if ENV["DB"] == "active_record"
198
208
  ActiveRecord::Base.establish_connection
199
209
  ActiveRecord::Base.logger = $logger
@@ -116,7 +116,7 @@ class RailsDashboardTest < ActionController::TestCase
116
116
  def test_complete_forces_confirmation
117
117
  xhr :post, :complete, :e => "food", :a => 0
118
118
  assert_response :success
119
- assert_equal 0, assigns(:to_confirm)
119
+ assert @response.body =~ /#{ CGI.unescape({ :confirmed => 0 }.to_query) }/
120
120
  end
121
121
 
122
122
  def test_complete_with_confirmation_completes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vanity
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.4
4
+ version: 2.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Assaf Arkin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-22 00:00:00.000000000 Z
11
+ date: 2016-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: i18n
@@ -175,6 +175,8 @@ files:
175
175
  - gemfiles/rails42.gemfile.lock
176
176
  - gemfiles/rails42_protected_attributes.gemfile
177
177
  - gemfiles/rails42_protected_attributes.gemfile.lock
178
+ - gemfiles/rails5.gemfile
179
+ - gemfiles/rails5.gemfile.lock
178
180
  - lib/generators/templates/vanity_migration.rb
179
181
  - lib/generators/vanity/views_generator.rb
180
182
  - lib/generators/vanity_generator.rb
@@ -284,7 +286,7 @@ metadata: {}
284
286
  post_install_message: To get started run vanity --help
285
287
  rdoc_options:
286
288
  - "--title"
287
- - Vanity 2.2.4
289
+ - Vanity 2.2.6
288
290
  - "--main"
289
291
  - README.md
290
292
  - "--webcvs"