vignette 0.0.15 → 0.0.16
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/README.md +18 -0
- data/lib/vignette/object_extensions.rb +10 -11
- data/lib/vignette/version.rb +1 -1
- data/lib/vignette.rb +19 -5
- data/spec/lib/vignette/object_extensions_spec.rb +31 -0
- data/spec/lib/vignette_spec.rb +24 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e6cdf3a27251255b9bed7d82c76816ce95edc8c
|
4
|
+
data.tar.gz: 6a43fd6f66033556886fc788b21ef56c3b97f66f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 55df73bf300cdc624ebc4728c5fe5fa8213bb882322fe6749059e8bdd31dff343b40aa975f33655cd31b2644ce6ee1c8932a3048c6a656f0a323debd5b15861e
|
7
|
+
data.tar.gz: be530c3ba036ac2d02b0f855cb0424c14b6d184fab3ae374dd5bd1013b85d85a399b003f1744f06d4246eb7be0d613b3c7f86e9318b12ff775c0dc5086a029e9
|
data/README.md
CHANGED
@@ -92,6 +92,24 @@ This will lead to `Vignette.tests` to include: `{ "cat_names" => "Chairman Meow"
|
|
92
92
|
|
93
93
|
Without a name, Vignettes will try to name themselves based on the name of the falling calling them, e.g. `(app/models/user.rb:25)` or `(app/views/users/new.html.haml:22)`
|
94
94
|
|
95
|
+
## Force Choice
|
96
|
+
|
97
|
+
When using in Ruby on Rails, you may set the `force_choice_param` flag, which will allow Vignette to choose a specific split based on a url param. E.g. in an initializer:
|
98
|
+
|
99
|
+
```ruby
|
100
|
+
Vignette.force_choice_param = :v
|
101
|
+
```
|
102
|
+
|
103
|
+
and in a controller (e.g. `home_controller.rb`)
|
104
|
+
|
105
|
+
```ruby
|
106
|
+
def home
|
107
|
+
@salutation = ['hello', 'goodbye'].vignette
|
108
|
+
end
|
109
|
+
|
110
|
+
```
|
111
|
+
Then, visit: `http://localhost:3000/?v=goodbye`. This will automatically choose the 'goodbye' split. Note: this will only choose a given split if that is an option in the Vignette array itself (e.g. `v=see+you` would be ignored).
|
112
|
+
|
95
113
|
## Caveats
|
96
114
|
|
97
115
|
Tests are stored in your store object based on the original input. If you change the input of the test (regardless of the name), a new test will be created. Thus [1,2,3].vignette(:numbers) and [2,3,4].vignette(:numbers) will always be considered unique tests. New tests will overwrite old tests with the same name in `Vignette.tests`. This is by design so that you can update the test, have new results, but keep the same test name in your analytics system.
|
@@ -1,11 +1,5 @@
|
|
1
1
|
module ObjectExtensions
|
2
2
|
|
3
|
-
module Merge
|
4
|
-
def merge(store, key, hash)
|
5
|
-
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
3
|
# Extensions to the Array object
|
10
4
|
module ArrayExtensions
|
11
5
|
|
@@ -17,9 +11,6 @@ module ObjectExtensions
|
|
17
11
|
def vignette(name=nil, expect_consistent_name: true)
|
18
12
|
vignette_crc = self.crc().abs.to_s(16)
|
19
13
|
|
20
|
-
key = "vignette_#{vignette_crc}"
|
21
|
-
test_name = nil
|
22
|
-
|
23
14
|
vig = Vignette.vig
|
24
15
|
|
25
16
|
test_name = if expect_consistent_name && name.present?
|
@@ -35,9 +26,11 @@ module ObjectExtensions
|
|
35
26
|
|
36
27
|
result = if vig.has_key?(vignette_crc)
|
37
28
|
vig[vignette_crc]['v']
|
29
|
+
elsif Vignette.force_choice && self.include?(Vignette.force_choice)
|
30
|
+
Vignette.force_choice
|
38
31
|
else
|
39
32
|
# Store key into storage if not available
|
40
|
-
new_value = self[
|
33
|
+
new_value = self[Vignette::rand(length)]
|
41
34
|
|
42
35
|
Vignette.set_vig( vig.merge(vignette_crc => { n: test_name, v: new_value, t: Time.now.to_i }) )
|
43
36
|
|
@@ -68,7 +61,13 @@ module ObjectExtensions
|
|
68
61
|
Hash.new
|
69
62
|
end
|
70
63
|
|
71
|
-
Vignette.
|
64
|
+
force_choice = if Vignette.force_choice_param
|
65
|
+
params[Vignette.force_choice_param]
|
66
|
+
else
|
67
|
+
nil
|
68
|
+
end
|
69
|
+
|
70
|
+
Vignette.with_repo(repo, force_choice) do
|
72
71
|
yield
|
73
72
|
end
|
74
73
|
end
|
data/lib/vignette/version.rb
CHANGED
data/lib/vignette.rb
CHANGED
@@ -16,12 +16,14 @@ module Vignette
|
|
16
16
|
# Module Attributes, please set via `init()`
|
17
17
|
mattr_accessor :logging
|
18
18
|
mattr_accessor :store
|
19
|
+
mattr_accessor :force_choice_param
|
19
20
|
|
20
21
|
# Initialization Code
|
21
22
|
|
22
23
|
# Defaults
|
23
24
|
Vignette.store = :session
|
24
25
|
Vignette.logging = false
|
26
|
+
Vignette.force_choice_param = nil
|
25
27
|
|
26
28
|
# We're going to include ArrayExtensions
|
27
29
|
ActionController::Base.send(:include, ObjectExtensions::ActionControllerExtensions)
|
@@ -37,19 +39,21 @@ module Vignette
|
|
37
39
|
end
|
38
40
|
|
39
41
|
# Sets the current repo to be used to get and store tests for this thread
|
40
|
-
def self.set_repo(repo)
|
42
|
+
def self.set_repo(repo, force_choice=nil)
|
41
43
|
Thread.current[:vignette_repo] = repo
|
44
|
+
Thread.current[:vignette_force_choice] = force_choice
|
42
45
|
end
|
43
46
|
|
44
47
|
# Clears the current repo on this thread
|
45
48
|
def self.clear_repo
|
46
|
-
set_repo(nil)
|
49
|
+
set_repo(nil, nil)
|
47
50
|
end
|
48
51
|
|
49
52
|
# Performs block with repo set to `repo` for this thread
|
50
|
-
|
53
|
+
# Force choice will be automatically selected if given
|
54
|
+
def self.with_repo(repo, force_choice=nil)
|
51
55
|
begin
|
52
|
-
Vignette.set_repo(repo)
|
56
|
+
Vignette.set_repo(repo, force_choice)
|
53
57
|
|
54
58
|
yield
|
55
59
|
ensure
|
@@ -69,6 +73,13 @@ module Vignette
|
|
69
73
|
Thread.current[:vignette_repo]
|
70
74
|
end
|
71
75
|
|
76
|
+
# Get the force_choice for this thread
|
77
|
+
def self.force_choice
|
78
|
+
raise Errors::ConfigError.new("Repo not active, please call Vignette.set_repo before using Vignette (or use around_filter in Rails)") if !active?
|
79
|
+
|
80
|
+
Thread.current[:vignette_force_choice]
|
81
|
+
end
|
82
|
+
|
72
83
|
# From the repo (default whatever is set for the thread), grab Vignettes' repo and unpack
|
73
84
|
def self.vig(repo=nil)
|
74
85
|
repo ||= Vignette.repo # allow using existing
|
@@ -95,11 +106,14 @@ module Vignette
|
|
95
106
|
private
|
96
107
|
|
97
108
|
def self.strip_path(filename)
|
98
|
-
if defined?(Rails) && Rails
|
109
|
+
if defined?(Rails) && Rails && Rails.respond_to?(:root)
|
99
110
|
filename.gsub(Regexp.new("#{Rails.root}[/]?"), '')
|
100
111
|
else
|
101
112
|
filename.split('/')[-1]
|
102
113
|
end
|
103
114
|
end
|
104
115
|
|
116
|
+
def self.rand(length)
|
117
|
+
Kernel.rand(length)
|
118
|
+
end
|
105
119
|
end
|
@@ -16,6 +16,14 @@ describe ObjectExtensions do
|
|
16
16
|
|
17
17
|
include ObjectExtensions::ActionControllerExtensions
|
18
18
|
|
19
|
+
def set_params(p)
|
20
|
+
@params = p
|
21
|
+
end
|
22
|
+
|
23
|
+
def params
|
24
|
+
@params || {}
|
25
|
+
end
|
26
|
+
|
19
27
|
def session
|
20
28
|
{ session_id: "whatever" }
|
21
29
|
end
|
@@ -44,5 +52,28 @@ describe ObjectExtensions do
|
|
44
52
|
expect(Vignette.tests).to eq(number: 3)
|
45
53
|
end
|
46
54
|
end
|
55
|
+
|
56
|
+
context "with force choice" do
|
57
|
+
around(:each) do |example|
|
58
|
+
Vignette.force_choice_param = :v
|
59
|
+
example.run
|
60
|
+
Vignette.force_choice_param = nil
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should correctly run forced choice" do
|
64
|
+
expect(Kernel).to receive(:rand).never
|
65
|
+
expect(Vignette.active?).to be(false)
|
66
|
+
|
67
|
+
tc = TestController.new
|
68
|
+
tc.set_params({v: 'dog'})
|
69
|
+
|
70
|
+
tc.run do
|
71
|
+
expect(Vignette.repo).to eq(tc.session)
|
72
|
+
expect(Vignette.active?).to be(true)
|
73
|
+
expect(%w{cat dog parrot turtle horse}.vignette).to eq('dog')
|
74
|
+
expect(Vignette.tests).to eq({})
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
47
78
|
end
|
48
79
|
end
|
data/spec/lib/vignette_spec.rb
CHANGED
@@ -177,4 +177,28 @@ describe Vignette do
|
|
177
177
|
|
178
178
|
end
|
179
179
|
|
180
|
+
context 'for force choice' do
|
181
|
+
let!(:session) { Hash.new }
|
182
|
+
let(:array) { %w{a b c d e f g h i j k l m n o p q r s t u v w x y z} }
|
183
|
+
|
184
|
+
it 'should store tests in session' do
|
185
|
+
expect(Kernel).to receive(:rand).never
|
186
|
+
|
187
|
+
Vignette.set_repo(session, 'p')
|
188
|
+
|
189
|
+
expect(array.vignette).to eq('p')
|
190
|
+
expect(Vignette.tests).to eq({})
|
191
|
+
end
|
192
|
+
|
193
|
+
it 'should store tests in session' do
|
194
|
+
expect(Kernel).to receive(:rand).and_return(4)
|
195
|
+
|
196
|
+
Vignette.set_repo(session, 'zz')
|
197
|
+
|
198
|
+
expect(array.vignette).to eq('e')
|
199
|
+
expect(Vignette.tests).to_not eq({})
|
200
|
+
end
|
201
|
+
|
202
|
+
end
|
203
|
+
|
180
204
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vignette
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Geoff Hayes
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|