vignette 0.0.10 → 0.0.11
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/lib/vignette/filter.rb +2 -2
- data/lib/vignette/object_extensions.rb +23 -13
- data/lib/vignette/version.rb +1 -1
- data/lib/vignette.rb +11 -0
- data/spec/lib/vignette/filter_spec.rb +3 -3
- data/spec/lib/vignette_spec.rb +42 -13
- data/spec/spec_helper.rb +1 -0
- data/vignette.gemspec +1 -0
- metadata +15 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 196be79b8ba920292a1e9322f8ab84f4ddfa1fd1
|
4
|
+
data.tar.gz: c7ec87488bf8c8f5cb57dc192e2c011402d3540f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e281220e3815bae46954f16b5d0126d1ea601771e51ac69a426449c6351af93b0ff64916636d8f5f092027a462a46a5639e8391cbe9801b4b609f1b0dbaf3300
|
7
|
+
data.tar.gz: 9b2d4e372dc309a4e7509d49eeaaa0d43d4ee9c7df82ecaaf729dc1bc31b93bc62bcfef21318baaa3a0989f5d4f7d1f9394549bd023713bb3ac7716078d0b8a2
|
data/lib/vignette/filter.rb
CHANGED
@@ -16,9 +16,9 @@ if defined?(Haml)
|
|
16
16
|
# Otherwise, try to use filename and line
|
17
17
|
elsif options[:filename] && options[:line]
|
18
18
|
if options[:filename] == "(haml)"
|
19
|
-
lines.vignette("(haml:#{options[:line]})")
|
19
|
+
lines.vignette("(haml:#{options[:line]})", expect_consistent_name: false)
|
20
20
|
else
|
21
|
-
lines.vignette("(#{Vignette::strip_path(options[:filename])}:#{options[:line]})")
|
21
|
+
lines.vignette("(#{Vignette::strip_path(options[:filename])}:#{options[:line]})", expect_consistent_name: false)
|
22
22
|
end
|
23
23
|
# If not given, raise an error
|
24
24
|
else
|
@@ -1,5 +1,11 @@
|
|
1
1
|
module ObjectExtensions
|
2
2
|
|
3
|
+
module Merge
|
4
|
+
def merge(store, key, hash)
|
5
|
+
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
3
9
|
# Extensions to the Array object
|
4
10
|
module ArrayExtensions
|
5
11
|
|
@@ -8,32 +14,36 @@ module ObjectExtensions
|
|
8
14
|
end
|
9
15
|
|
10
16
|
# Test will select a random object from the Array
|
11
|
-
def vignette(name=nil)
|
17
|
+
def vignette(name=nil, expect_consistent_name: true)
|
12
18
|
vignette_crc = self.crc().abs.to_s(16)
|
13
19
|
|
14
20
|
key = "vignette_#{vignette_crc}"
|
15
21
|
test_name = nil
|
16
22
|
|
17
23
|
store = Vignette.get_store
|
24
|
+
v = store[:v] ? JSON(store[:v]) : {}
|
18
25
|
|
19
|
-
test_name = if name.present?
|
26
|
+
test_name = if expect_consistent_name && name.present?
|
27
|
+
name
|
28
|
+
elsif test_hash = v[vignette_crc]
|
29
|
+
test_hash['name']
|
30
|
+
elsif name.present? # this logic looks weird, but this is if we don't expect consistent names *and* we don't have a name in v[]
|
20
31
|
name
|
21
|
-
elsif store[:vt] && original_name = JSON(store[:vt])[vignette_crc]
|
22
|
-
original_name
|
23
32
|
else
|
24
33
|
loc = caller_locations(1,1).first
|
25
|
-
|
26
|
-
|
27
|
-
store[:vt] = ( store[:vt].present? ? JSON(store[:vt]) : {} ).merge(vignette_crc => new_name).to_json
|
28
|
-
|
29
|
-
new_name
|
34
|
+
"(#{Vignette::strip_path(loc.absolute_path)}:#{loc.lineno})"
|
30
35
|
end
|
31
36
|
|
32
|
-
|
33
|
-
|
37
|
+
result = if v.has_key?(vignette_crc)
|
38
|
+
v[vignette_crc]['v']
|
39
|
+
else
|
40
|
+
# Store key into storage if not available
|
41
|
+
new_value = self[Kernel.rand(length)]
|
34
42
|
|
35
|
-
|
36
|
-
|
43
|
+
store[:v] = v.merge(vignette_crc => { n: test_name, v: new_value, t: Time.now.to_i }).to_json
|
44
|
+
|
45
|
+
new_value
|
46
|
+
end
|
37
47
|
|
38
48
|
return result
|
39
49
|
end
|
data/lib/vignette/version.rb
CHANGED
data/lib/vignette.rb
CHANGED
@@ -63,6 +63,17 @@ module Vignette
|
|
63
63
|
def self.tests(session=Vignette.session, cookies=Vignette.cookies)
|
64
64
|
store = get_store(session, cookies)
|
65
65
|
store && store[:v].present? ? JSON(store[:v]) : {}
|
66
|
+
if store && store[:v].present?
|
67
|
+
v = JSON(store[:v])
|
68
|
+
|
69
|
+
name_values = v.values.map { |v| [ v['n'], [ v['t'], v['v'] ] ] }.group_by { |el| el[0] }
|
70
|
+
|
71
|
+
arr = name_values.map { |k,v| [ k.to_sym, v.sort { |a,b| b[1][0] <=> a[1][0] }.first[1][1] ] }
|
72
|
+
|
73
|
+
Hash[arr]
|
74
|
+
else
|
75
|
+
{}
|
76
|
+
end
|
66
77
|
end
|
67
78
|
|
68
79
|
def self.get_store(session=Vignette.session, cookies=Vignette.cookies)
|
@@ -20,7 +20,7 @@ describe Haml::Filters::Vignette do
|
|
20
20
|
html = Haml::Engine.new(template).render
|
21
21
|
|
22
22
|
expect(html).to match(/\<p\>\s+three\s+\<\/p\>\n/)
|
23
|
-
expect(Vignette.tests).to eq({"(haml:3)" => "three"})
|
23
|
+
expect(Vignette.tests).to eq({:"(haml:3)" => "three"})
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -40,7 +40,7 @@ describe Haml::Filters::Vignette do
|
|
40
40
|
html = Haml::Engine.new(template).render
|
41
41
|
|
42
42
|
expect(html).to match(/\<p\>\s+three\s+\<\/p\>\n/)
|
43
|
-
expect(Vignette.tests).to eq({"numbers" => "three"})
|
43
|
+
expect(Vignette.tests).to eq({:"numbers" => "three"})
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
@@ -55,7 +55,7 @@ describe Haml::Filters::Vignette do
|
|
55
55
|
html = Haml::Engine.new(template, filename: template_file).render
|
56
56
|
|
57
57
|
expect(html).to match(/\<div\>\s+I like\s+scorpians\s+\<\/div\>/)
|
58
|
-
expect(Vignette.tests).to eq({"(ex.html.haml:3)" => "scorpians"})
|
58
|
+
expect(Vignette.tests).to eq({:"(ex.html.haml:3)" => "scorpians"})
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|
data/spec/lib/vignette_spec.rb
CHANGED
@@ -18,32 +18,61 @@ describe Vignette do
|
|
18
18
|
|
19
19
|
it 'should store tests in session' do
|
20
20
|
expect(array.vignette).to eq('b'); line = __LINE__ # for tracking line number
|
21
|
-
expect(Vignette.tests).to eq({"(vignette_spec.rb:#{line})" => 'b'})
|
21
|
+
expect(Vignette.tests).to eq({:"(vignette_spec.rb:#{line})" => 'b'})
|
22
22
|
end
|
23
23
|
|
24
24
|
it 'should store tests even if we call on different lines' do
|
25
25
|
expect(array.vignette).to eq('b'); line = __LINE__
|
26
|
-
expect(Vignette.tests).to eq({"(vignette_spec.rb:#{line})" => 'b'})
|
26
|
+
expect(Vignette.tests).to eq({:"(vignette_spec.rb:#{line})" => 'b'})
|
27
27
|
|
28
28
|
expect(array.vignette).to eq('b'); new_line = __LINE__
|
29
|
-
expect(Vignette.tests).to eq({"(vignette_spec.rb:#{line})" => 'b'})
|
29
|
+
expect(Vignette.tests).to eq({:"(vignette_spec.rb:#{line})" => 'b'})
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
33
|
context "for multiple runs" do
|
34
|
-
before(:each) { expect(Kernel).to receive(:rand).and_return(1, 2) }
|
34
|
+
before(:each) { expect(Kernel).to receive(:rand).and_return(1, 2, 0) }
|
35
35
|
|
36
36
|
it 'should store tests in session by name' do
|
37
|
-
expect(array.vignette(
|
37
|
+
expect(array.vignette(:cat)).to eq('b')
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
39
|
+
original_time = Time.now
|
40
|
+
second_time = original_time + 1
|
41
|
+
third_time = original_time + 2
|
42
|
+
fourth_time = original_time + 3
|
43
|
+
|
44
|
+
Timecop.freeze(original_time) do
|
45
|
+
expect(Vignette.tests).to eq(cat: 'b') # original choice
|
46
|
+
expect(JSON(session[:v])).to eq( { '352441c2' => { 'n' => 'cat', 'v' => 'b', 't' => original_time.to_i } } )
|
47
|
+
end
|
48
|
+
|
49
|
+
Timecop.freeze(second_time) do
|
50
|
+
expect(Vignette.tests).to eq(cat: 'b') # same value
|
51
|
+
expect(JSON(session[:v])).to eq( { '352441c2' => { 'n' => 'cat', 'v' => 'b', 't' => original_time.to_i } } )
|
52
|
+
end
|
53
|
+
|
54
|
+
Timecop.freeze(third_time) do
|
55
|
+
expect([11,22,33].vignette(:cat)).to eq(33) # new value
|
56
|
+
expect(JSON(session[:v])).to eq(
|
57
|
+
{
|
58
|
+
'352441c2' => { 'n' => 'cat', 'v' => 'b', 't' => original_time.to_i },
|
59
|
+
'd4d3e16f' => { 'n' => 'cat', 'v' => 33, 't' => third_time.to_i }
|
60
|
+
}
|
61
|
+
)
|
62
|
+
expect(Vignette.tests).to eq(cat: 33)
|
63
|
+
end
|
64
|
+
|
65
|
+
Timecop.freeze(fourth_time) do
|
66
|
+
expect(['mice', 'mooise'].vignette(:cat)).to eq('mice') # new value
|
67
|
+
expect(JSON(session[:v])).to eq(
|
68
|
+
{
|
69
|
+
'2384053' => { 'n' => 'cat', 'v' => 'mice', 't' => fourth_time.to_i },
|
70
|
+
'352441c2' => { 'n' => 'cat', 'v' => 'b', 't' => original_time.to_i },
|
71
|
+
'd4d3e16f' => { 'n' => 'cat', 'v' => 33, 't' => third_time.to_i }
|
72
|
+
}
|
73
|
+
)
|
74
|
+
expect(Vignette.tests).to eq(cat: 'mice')
|
75
|
+
end
|
47
76
|
end
|
48
77
|
end
|
49
78
|
end
|
data/spec/spec_helper.rb
CHANGED
data/vignette.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Geoff Hayes
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: timecop
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
97
111
|
description: Simple, effective A/b testing made easy.
|
98
112
|
email:
|
99
113
|
- geoff@safeshepherd.com
|