vanity 2.0.1 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +1 -2
- data/Appraisals +6 -6
- data/CHANGELOG +9 -3
- data/Gemfile.lock +1 -1
- data/README.md +299 -0
- data/doc/configuring.textile +8 -1
- data/doc/identity.textile +2 -0
- data/doc/metrics.textile +10 -0
- data/gemfiles/rails32.gemfile.lock +1 -1
- data/gemfiles/rails41.gemfile.lock +1 -1
- data/gemfiles/rails42.gemfile.lock +1 -1
- data/gemfiles/{rails4.gemfile → rails42_protected_attributes.gemfile} +2 -2
- data/gemfiles/rails42_protected_attributes.gemfile.lock +209 -0
- data/lib/generators/templates/vanity_migration.rb +1 -0
- data/lib/vanity/adapters/abstract_adapter.rb +11 -0
- data/lib/vanity/adapters/active_record_adapter.rb +15 -1
- data/lib/vanity/adapters/mock_adapter.rb +14 -0
- data/lib/vanity/adapters/mongodb_adapter.rb +14 -0
- data/lib/vanity/adapters/redis_adapter.rb +15 -0
- data/lib/vanity/configuration.rb +43 -11
- data/lib/vanity/experiment/ab_test.rb +145 -15
- data/lib/vanity/experiment/alternative.rb +4 -0
- data/lib/vanity/frameworks/rails.rb +69 -31
- data/lib/vanity/locales/vanity.en.yml +9 -0
- data/lib/vanity/locales/vanity.pt-BR.yml +4 -0
- data/lib/vanity/metric/active_record.rb +9 -1
- data/lib/vanity/templates/_ab_test.erb +9 -2
- data/lib/vanity/templates/_experiment.erb +21 -1
- data/lib/vanity/templates/vanity.css +11 -3
- data/lib/vanity/templates/vanity.js +35 -6
- data/lib/vanity/version.rb +1 -1
- data/test/commands/report_test.rb +1 -0
- data/test/dummy/config/application.rb +1 -0
- data/test/experiment/ab_test.rb +414 -0
- data/test/experiment/base_test.rb +16 -10
- data/test/frameworks/rails/action_controller_test.rb +14 -6
- data/test/frameworks/rails/action_mailer_test.rb +8 -6
- data/test/frameworks/rails/action_view_test.rb +1 -0
- data/test/helper_test.rb +2 -0
- data/test/metric/active_record_test.rb +56 -0
- data/test/playground_test.rb +3 -0
- data/test/test_helper.rb +28 -2
- data/test/web/rails/dashboard_test.rb +2 -0
- data/vanity.gemspec +2 -2
- metadata +8 -8
- data/README.rdoc +0 -231
- data/gemfiles/rails4.gemfile.lock +0 -179
@@ -9,7 +9,7 @@ describe Vanity::Experiment::Base do
|
|
9
9
|
# -- Defining experiment --
|
10
10
|
|
11
11
|
it "can access experiment by id" do
|
12
|
-
exp = new_ab_test(:ice_cream_flavor) { metrics :happiness }
|
12
|
+
exp = new_ab_test(:ice_cream_flavor) { metrics :happiness; default false }
|
13
13
|
assert_equal exp, experiment(:ice_cream_flavor)
|
14
14
|
end
|
15
15
|
|
@@ -17,8 +17,10 @@ describe Vanity::Experiment::Base do
|
|
17
17
|
File.open "tmp/experiments/ice_cream_flavor.rb", "w" do |f|
|
18
18
|
f.write <<-RUBY
|
19
19
|
ab_test "Ice Cream Flavor" do
|
20
|
+
default false
|
20
21
|
end
|
21
22
|
ab_test "Ice Cream Flavor" do
|
23
|
+
default false
|
22
24
|
end
|
23
25
|
RUBY
|
24
26
|
end
|
@@ -44,6 +46,7 @@ describe Vanity::Experiment::Base do
|
|
44
46
|
def xmts
|
45
47
|
"x"
|
46
48
|
end
|
49
|
+
default false
|
47
50
|
end
|
48
51
|
RUBY
|
49
52
|
end
|
@@ -72,8 +75,8 @@ describe Vanity::Experiment::Base do
|
|
72
75
|
end
|
73
76
|
|
74
77
|
it "reloading experiments" do
|
75
|
-
new_ab_test(:ab) { metrics :happiness }
|
76
|
-
new_ab_test(:cd) { metrics :happiness }
|
78
|
+
new_ab_test(:ab) { metrics :happiness; default false }
|
79
|
+
new_ab_test(:cd) { metrics :happiness; default false }
|
77
80
|
assert_equal 2, Vanity.playground.experiments.size
|
78
81
|
Vanity.playground.reload!
|
79
82
|
assert Vanity.playground.experiments.empty?
|
@@ -83,7 +86,7 @@ describe Vanity::Experiment::Base do
|
|
83
86
|
# -- Attributes --
|
84
87
|
|
85
88
|
it "maps the experiment name to id" do
|
86
|
-
experiment = new_ab_test("Ice Cream Flavor/Tastes") { metrics :happiness }
|
89
|
+
experiment = new_ab_test("Ice Cream Flavor/Tastes") { metrics :happiness; default false }
|
87
90
|
assert_equal "Ice Cream Flavor/Tastes", experiment.name
|
88
91
|
assert_equal :ice_cream_flavor_tastes, experiment.id
|
89
92
|
end
|
@@ -92,15 +95,17 @@ describe Vanity::Experiment::Base do
|
|
92
95
|
File.open "tmp/experiments/ice_cream_flavor.rb", "w" do |f|
|
93
96
|
f.write <<-RUBY
|
94
97
|
ab_test "Ice Cream Flavor" do
|
98
|
+
default false
|
95
99
|
end
|
96
100
|
RUBY
|
97
101
|
end
|
98
102
|
Vanity.unload!
|
103
|
+
metric :happiness
|
99
104
|
Vanity.playground.experiment(:ice_cream_flavor)
|
100
105
|
end
|
101
106
|
|
102
107
|
it "has created timestamp" do
|
103
|
-
new_ab_test(:ice_cream_flavor) { metrics :happiness }
|
108
|
+
new_ab_test(:ice_cream_flavor) { metrics :happiness; default false }
|
104
109
|
assert_kind_of Time, experiment(:ice_cream_flavor).created_at
|
105
110
|
assert_in_delta experiment(:ice_cream_flavor).created_at.to_i, Time.now.to_i, 1
|
106
111
|
end
|
@@ -108,12 +113,12 @@ describe Vanity::Experiment::Base do
|
|
108
113
|
it "keeps created timestamp across definitions" do
|
109
114
|
past = Date.today - 1
|
110
115
|
Timecop.freeze past.to_time do
|
111
|
-
new_ab_test(:ice_cream_flavor) { metrics :happiness }
|
116
|
+
new_ab_test(:ice_cream_flavor) { metrics :happiness; default false }
|
112
117
|
end
|
113
118
|
|
114
119
|
vanity_reset
|
115
120
|
metric :happiness
|
116
|
-
new_ab_test(:ice_cream_flavor) { metrics :happiness }
|
121
|
+
new_ab_test(:ice_cream_flavor) { metrics :happiness; default false }
|
117
122
|
assert_equal past.to_time.to_i, experiment(:ice_cream_flavor).created_at.to_i
|
118
123
|
end
|
119
124
|
|
@@ -121,13 +126,14 @@ describe Vanity::Experiment::Base do
|
|
121
126
|
new_ab_test :ice_cream_flavor do
|
122
127
|
description "Because 31 is not enough ..."
|
123
128
|
metrics :happiness
|
129
|
+
default false
|
124
130
|
end
|
125
131
|
assert_equal "Because 31 is not enough ...", experiment(:ice_cream_flavor).description
|
126
132
|
end
|
127
133
|
|
128
134
|
it "stores nothing when collection disabled" do
|
129
135
|
not_collecting!
|
130
|
-
new_ab_test(:ice_cream_flavor) { metrics :happiness }
|
136
|
+
new_ab_test(:ice_cream_flavor) { metrics :happiness; default false }
|
131
137
|
experiment(:ice_cream_flavor).complete!
|
132
138
|
end
|
133
139
|
|
@@ -136,7 +142,7 @@ describe Vanity::Experiment::Base do
|
|
136
142
|
# check_completion is called by derived classes, but since it's
|
137
143
|
# part of the base_test I'm testing it here.
|
138
144
|
it "handles error in check completion" do
|
139
|
-
new_ab_test(:ab) { metrics :happiness }
|
145
|
+
new_ab_test(:ab) { metrics :happiness; default false }
|
140
146
|
e = experiment(:ab)
|
141
147
|
e.complete_if { true }
|
142
148
|
e.stubs(:complete!).raises(RuntimeError, "A forced error")
|
@@ -146,7 +152,7 @@ describe Vanity::Experiment::Base do
|
|
146
152
|
end
|
147
153
|
|
148
154
|
it "complete updates completed_at" do
|
149
|
-
new_ab_test(:ice_cream_flavor) { metrics :happiness }
|
155
|
+
new_ab_test(:ice_cream_flavor) { metrics :happiness; default false }
|
150
156
|
|
151
157
|
time = Time.utc(2008, 9, 1, 12, 0, 0)
|
152
158
|
Timecop.freeze(time) do
|
@@ -33,6 +33,8 @@ class UseVanityControllerTest < ActionController::TestCase
|
|
33
33
|
metric :sugar_high
|
34
34
|
new_ab_test :pie_or_cake do
|
35
35
|
metrics :sugar_high
|
36
|
+
alternatives :pie, :cake
|
37
|
+
default :pie
|
36
38
|
end
|
37
39
|
|
38
40
|
# Class eval this instead of including in the controller to delay
|
@@ -64,13 +66,13 @@ class UseVanityControllerTest < ActionController::TestCase
|
|
64
66
|
end
|
65
67
|
|
66
68
|
def test_chooses_sets_alternatives_for_rails_tests
|
67
|
-
experiment(:pie_or_cake).chooses(
|
69
|
+
experiment(:pie_or_cake).chooses(:pie)
|
68
70
|
get :index
|
69
|
-
assert_equal '
|
71
|
+
assert_equal 'pie', @response.body
|
70
72
|
|
71
|
-
experiment(:pie_or_cake).chooses(
|
73
|
+
experiment(:pie_or_cake).chooses(:cake)
|
72
74
|
get :index
|
73
|
-
assert_equal '
|
75
|
+
assert_equal 'cake', @response.body
|
74
76
|
end
|
75
77
|
|
76
78
|
def test_adds_participant_to_experiment
|
@@ -91,7 +93,7 @@ class UseVanityControllerTest < ActionController::TestCase
|
|
91
93
|
assert_match /vanity_id=[a-f0-9]{32};/, cookie
|
92
94
|
expires = cookie[/expires=(.*)(;|$)/, 1]
|
93
95
|
assert expires
|
94
|
-
assert_in_delta Time.parse(expires), Time.now +
|
96
|
+
assert_in_delta Time.parse(expires), Time.now + 20 * 365 * 24 * 60 * 60, 1.day
|
95
97
|
end
|
96
98
|
|
97
99
|
def test_vanity_cookie_default_id
|
@@ -105,6 +107,12 @@ class UseVanityControllerTest < ActionController::TestCase
|
|
105
107
|
assert_equal "from_last_time", cookies["vanity_id"]
|
106
108
|
end
|
107
109
|
|
110
|
+
def test_vanity_cookie_uses_configuration
|
111
|
+
Vanity.configuration.cookie_name = "new_id"
|
112
|
+
get :index
|
113
|
+
assert cookies["new_id"] =~ /^[a-f0-9]{32}$/
|
114
|
+
end
|
115
|
+
|
108
116
|
def test_vanity_identity_set_from_cookie
|
109
117
|
@request.cookies["vanity_id"] = "from_last_time"
|
110
118
|
get :index
|
@@ -204,4 +212,4 @@ class UseVanityControllerTest < ActionController::TestCase
|
|
204
212
|
assert_match /domain=.foo.bar/, @response["Set-Cookie"] if ::Rails.respond_to?(:application)
|
205
213
|
end
|
206
214
|
|
207
|
-
end
|
215
|
+
end
|
@@ -28,13 +28,15 @@ class UseVanityMailerTest < ActionMailer::TestCase
|
|
28
28
|
metric :sugar_high
|
29
29
|
new_ab_test :pie_or_cake do
|
30
30
|
metrics :sugar_high
|
31
|
+
alternatives :pie, :cake
|
32
|
+
default :pie
|
31
33
|
end
|
32
34
|
end
|
33
35
|
|
34
36
|
def test_js_enabled_still_adds_participant
|
35
37
|
Vanity.playground.use_js!
|
36
38
|
experiment(:pie_or_cake).identify { }
|
37
|
-
experiment(:pie_or_cake).chooses(
|
39
|
+
experiment(:pie_or_cake).chooses(:pie)
|
38
40
|
VanityMailer.ab_test_subject(nil)
|
39
41
|
|
40
42
|
|
@@ -45,13 +47,13 @@ class UseVanityMailerTest < ActionMailer::TestCase
|
|
45
47
|
def test_returns_different_alternatives
|
46
48
|
experiment(:pie_or_cake).identify { }
|
47
49
|
|
48
|
-
experiment(:pie_or_cake).chooses(
|
50
|
+
experiment(:pie_or_cake).chooses(:pie)
|
49
51
|
email = VanityMailer.ab_test_subject(nil)
|
50
|
-
assert_equal '
|
52
|
+
assert_equal 'pie', email.subject
|
51
53
|
|
52
|
-
experiment(:pie_or_cake).chooses(
|
54
|
+
experiment(:pie_or_cake).chooses(:cake)
|
53
55
|
email = VanityMailer.ab_test_subject(nil)
|
54
|
-
assert_equal '
|
56
|
+
assert_equal 'cake', email.subject
|
55
57
|
end
|
56
58
|
|
57
59
|
def test_tracking_image_is_rendered
|
@@ -59,4 +61,4 @@ class UseVanityMailerTest < ActionMailer::TestCase
|
|
59
61
|
assert email.body =~ /<img/
|
60
62
|
assert email.body =~ /_identity=/
|
61
63
|
end
|
62
|
-
end
|
64
|
+
end
|
data/test/helper_test.rb
CHANGED
@@ -6,6 +6,7 @@ describe Vanity::Helpers do
|
|
6
6
|
metric "Coolness"
|
7
7
|
new_ab_test :foobar do
|
8
8
|
alternatives "foo", "bar"
|
9
|
+
default "foo"
|
9
10
|
metrics :coolness
|
10
11
|
end
|
11
12
|
Vanity.track!(:coolness, :identity=>'quux')
|
@@ -17,6 +18,7 @@ describe Vanity::Helpers do
|
|
17
18
|
metric "Coolness"
|
18
19
|
new_ab_test :foobar do
|
19
20
|
alternatives "foo", "bar"
|
21
|
+
default "foo"
|
20
22
|
metrics :coolness
|
21
23
|
end
|
22
24
|
Vanity.track!(:coolness, :identity=>'quux', :values=>[2])
|
@@ -1,7 +1,15 @@
|
|
1
1
|
require "test_helper"
|
2
2
|
|
3
|
+
class User < ActiveRecord::Base
|
4
|
+
has_many :skies
|
5
|
+
|
6
|
+
attr_accessible :height if defined?(ProtectedAttributes)
|
7
|
+
end
|
3
8
|
class Sky < ActiveRecord::Base
|
9
|
+
belongs_to :user
|
4
10
|
scope :high, lambda { where("height >= 4") }
|
11
|
+
|
12
|
+
attr_accessible :height if defined?(ProtectedAttributes)
|
5
13
|
end
|
6
14
|
|
7
15
|
if ENV["DB"] == "active_record"
|
@@ -9,13 +17,20 @@ if ENV["DB"] == "active_record"
|
|
9
17
|
describe Vanity::Metric::ActiveRecord do
|
10
18
|
|
11
19
|
before do
|
20
|
+
User.connection.create_table(:users) do |t|
|
21
|
+
t.timestamps
|
22
|
+
end
|
12
23
|
Sky.connection.create_table(:skies) do |t|
|
24
|
+
t.integer :user_id
|
13
25
|
t.integer :height
|
14
26
|
t.timestamps
|
15
27
|
end
|
16
28
|
end
|
17
29
|
|
18
30
|
after do
|
31
|
+
User.connection.drop_table(:users) if User.connection.table_exists?(User.table_name)
|
32
|
+
User.reset_callbacks(:create)
|
33
|
+
User.reset_callbacks(:save)
|
19
34
|
Sky.connection.drop_table(:skies) if Sky.connection.table_exists?(Sky.table_name)
|
20
35
|
Sky.reset_callbacks(:create)
|
21
36
|
Sky.reset_callbacks(:save)
|
@@ -235,6 +250,47 @@ describe Vanity::Metric::ActiveRecord do
|
|
235
250
|
assert_equal 2, times
|
236
251
|
end
|
237
252
|
|
253
|
+
it "with model identity" do
|
254
|
+
File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f|
|
255
|
+
f.write <<-RUBY
|
256
|
+
metric "Sky is limit" do
|
257
|
+
model Sky, :identity => lambda { |record| record.user_id }
|
258
|
+
end
|
259
|
+
RUBY
|
260
|
+
end
|
261
|
+
|
262
|
+
File.open "tmp/experiments/simple.rb", "w" do |f|
|
263
|
+
f.write <<-RUBY
|
264
|
+
ab_test "simple" do
|
265
|
+
metrics :sky_is_limit
|
266
|
+
alternatives :a, :b
|
267
|
+
identity { "me" }
|
268
|
+
end
|
269
|
+
RUBY
|
270
|
+
end
|
271
|
+
|
272
|
+
user = User.create
|
273
|
+
Vanity.context = stub(vanity_identity: user.id)
|
274
|
+
experiment = Vanity.playground.experiment(:simple)
|
275
|
+
experiment.choose
|
276
|
+
|
277
|
+
Vanity.context = nil
|
278
|
+
# Should count as a conversion for the user in the experiment.
|
279
|
+
user.skies.create
|
280
|
+
|
281
|
+
# Should count as a conversion for the newly created User.
|
282
|
+
User.create.skies.create
|
283
|
+
|
284
|
+
Vanity.context = stub(vanity_identity: "other")
|
285
|
+
experiment.choose
|
286
|
+
# Should count as a conversion for "other"
|
287
|
+
Sky.create
|
288
|
+
|
289
|
+
assert_equal 3, Sky.count
|
290
|
+
assert_equal 2, experiment.alternatives.map(&:participants).sum
|
291
|
+
assert_equal 3, experiment.alternatives.map(&:conversions).sum
|
292
|
+
end
|
293
|
+
|
238
294
|
it "do it yourself" do
|
239
295
|
File.open "tmp/experiments/metrics/sky_is_limit.rb", "w" do |f|
|
240
296
|
f.write <<-RUBY
|
data/test/playground_test.rb
CHANGED
@@ -19,6 +19,7 @@ describe Vanity::Playground do
|
|
19
19
|
f.write <<-RUBY
|
20
20
|
ab_test :foobar do
|
21
21
|
metrics :coolness
|
22
|
+
default false
|
22
23
|
end
|
23
24
|
RUBY
|
24
25
|
end
|
@@ -84,6 +85,7 @@ describe Vanity::Playground do
|
|
84
85
|
alternatives "foo", "bar"
|
85
86
|
identify { "abcdef" }
|
86
87
|
metrics :coolness
|
88
|
+
default "foo"
|
87
89
|
end
|
88
90
|
|
89
91
|
assert Vanity.playground.experiments_persisted?
|
@@ -122,6 +124,7 @@ describe Vanity::Playground do
|
|
122
124
|
alternatives "foo", "bar"
|
123
125
|
identify { "abcdef" }
|
124
126
|
metrics :coolness
|
127
|
+
default "foo"
|
125
128
|
end
|
126
129
|
alt = experiment(:foobar).choose
|
127
130
|
assert_equal [[Vanity.playground.experiment(:foobar), alt]], Vanity.playground.participant_info("abcdef")
|
data/test/test_helper.rb
CHANGED
@@ -81,6 +81,23 @@ module VanityTestHelpers
|
|
81
81
|
Vanity.unload!
|
82
82
|
end
|
83
83
|
|
84
|
+
# Call this on teardown. It wipes put the playground and any state held in it
|
85
|
+
# (mostly experiments), resets vanity ID, and clears database of all experiments.
|
86
|
+
def nuke_playground
|
87
|
+
Vanity.playground.connection.flushdb
|
88
|
+
new_playground
|
89
|
+
end
|
90
|
+
|
91
|
+
# Call this if you need a new playground, e.g. to re-define the same experiment,
|
92
|
+
# or reload an experiment (saved by the previous playground).
|
93
|
+
def new_playground
|
94
|
+
Vanity.playground = Vanity::Playground.new
|
95
|
+
Vanity.disconnect!
|
96
|
+
ActiveRecord::Base.establish_connection
|
97
|
+
Vanity.connect!(DATABASE)
|
98
|
+
end
|
99
|
+
|
100
|
+
|
84
101
|
# Defines the specified metrics (one or more names). Returns metric, or array
|
85
102
|
# of metric (if more than one argument).
|
86
103
|
def metric(*names)
|
@@ -92,11 +109,20 @@ module VanityTestHelpers
|
|
92
109
|
end
|
93
110
|
|
94
111
|
# Defines an A/B experiment.
|
95
|
-
|
112
|
+
# @param [Hash] options Options include:
|
113
|
+
# [Boolean] enable (default true) - Whether or not to enable this ab_test when it gets instantiated;
|
114
|
+
# this flag is here to simply the testing of experiment features, and also to allow
|
115
|
+
# testing of the default behavior of an experiment when it gets loaded.
|
116
|
+
# Note that :enable => false does NOT mean to set the ab_test to false; it
|
117
|
+
# means to not set enabled at all (the 'actual' behavior).
|
118
|
+
def new_ab_test(name, options = {}, &block)
|
119
|
+
enable = options.fetch(:enable, true)
|
96
120
|
id = name.to_s.downcase.gsub(/\W/, "_").to_sym
|
97
121
|
experiment = Vanity::Experiment::AbTest.new(Vanity.playground, id, name)
|
98
|
-
experiment.instance_eval
|
122
|
+
experiment.instance_eval &block if block
|
99
123
|
experiment.save
|
124
|
+
# new experiments start off as disabled, enable them for testing
|
125
|
+
experiment.enabled = true if enable
|
100
126
|
Vanity.playground.experiments[id] = experiment
|
101
127
|
end
|
102
128
|
|
@@ -14,12 +14,14 @@ class RailsDashboardTest < ActionController::TestCase
|
|
14
14
|
new_ab_test :food do
|
15
15
|
alternatives :apple, :orange
|
16
16
|
metrics :sugar_high
|
17
|
+
default :apple
|
17
18
|
identify { '1' }
|
18
19
|
end
|
19
20
|
|
20
21
|
metric :liquidity
|
21
22
|
new_ab_test :drink do
|
22
23
|
alternatives :tea, :coffee
|
24
|
+
default :tea
|
23
25
|
metrics :liquidity
|
24
26
|
identify { '1' }
|
25
27
|
end
|
data/vanity.gemspec
CHANGED
@@ -17,8 +17,8 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
|
-
spec.extra_rdoc_files = "README.
|
21
|
-
spec.rdoc_options = "--title", "Vanity #{spec.version}", "--main", "README.
|
20
|
+
spec.extra_rdoc_files = "README.md", "CHANGELOG"
|
21
|
+
spec.rdoc_options = "--title", "Vanity #{spec.version}", "--main", "README.md",
|
22
22
|
"--webcvs", "http://github.com/assaf/#{spec.name}"
|
23
23
|
|
24
24
|
spec.required_ruby_version = ">= 1.9.3"
|
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.0
|
4
|
+
version: 2.1.0
|
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-01-
|
11
|
+
date: 2016-01-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: i18n
|
@@ -58,7 +58,7 @@ executables:
|
|
58
58
|
- vanity
|
59
59
|
extensions: []
|
60
60
|
extra_rdoc_files:
|
61
|
-
- README.
|
61
|
+
- README.md
|
62
62
|
- CHANGELOG
|
63
63
|
files:
|
64
64
|
- .autotest
|
@@ -69,7 +69,7 @@ files:
|
|
69
69
|
- Gemfile
|
70
70
|
- Gemfile.lock
|
71
71
|
- MIT-LICENSE
|
72
|
-
- README.
|
72
|
+
- README.md
|
73
73
|
- Rakefile
|
74
74
|
- bin/vanity
|
75
75
|
- doc/_config.yml
|
@@ -99,12 +99,12 @@ files:
|
|
99
99
|
- doc/site.js
|
100
100
|
- gemfiles/rails32.gemfile
|
101
101
|
- gemfiles/rails32.gemfile.lock
|
102
|
-
- gemfiles/rails4.gemfile
|
103
|
-
- gemfiles/rails4.gemfile.lock
|
104
102
|
- gemfiles/rails41.gemfile
|
105
103
|
- gemfiles/rails41.gemfile.lock
|
106
104
|
- gemfiles/rails42.gemfile
|
107
105
|
- gemfiles/rails42.gemfile.lock
|
106
|
+
- gemfiles/rails42_protected_attributes.gemfile
|
107
|
+
- gemfiles/rails42_protected_attributes.gemfile.lock
|
108
108
|
- lib/generators/templates/vanity_migration.rb
|
109
109
|
- lib/generators/vanity/views_generator.rb
|
110
110
|
- lib/generators/vanity_generator.rb
|
@@ -211,9 +211,9 @@ metadata: {}
|
|
211
211
|
post_install_message: To get started run vanity --help
|
212
212
|
rdoc_options:
|
213
213
|
- --title
|
214
|
-
- Vanity 2.0
|
214
|
+
- Vanity 2.1.0
|
215
215
|
- --main
|
216
|
-
- README.
|
216
|
+
- README.md
|
217
217
|
- --webcvs
|
218
218
|
- http://github.com/assaf/vanity
|
219
219
|
require_paths:
|