optimizely_server_side 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rspec +1 -1
- data/Gemfile.lock +0 -3
- data/Readme.md +19 -2
- data/lib/optimizely_server_side.rb +7 -6
- data/lib/optimizely_server_side/experiment.rb +19 -9
- data/optimizely_server_side.gemspec +2 -3
- data/spec/optimizely_server_side/experiment_spec.rb +69 -2
- data/spec/spec_helper.rb +0 -1
- metadata +2 -23
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a8b2715ff8f9919582b449925b0838d4f1590b2
|
4
|
+
data.tar.gz: c3f89f698fed6d3590fcd342fe8efcff51370377
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 47125338faa0d15515e4e0586384b9972ca66703e1c912eaaafb535c1f183f1863d4500d6770703e3359d616c959ccdfe4c8f6224abae16455672b1ae6fbcff1
|
7
|
+
data.tar.gz: 146fea8cb394cf5cb687c66534fe6deb9c3b7e0ad902cef1f2a3761f8202206c432edd1af2cb3e418ed9add5f8e60ce30307ad06b86dbcd0e382b58ff21e0314
|
data/.rspec
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
--format
|
1
|
+
--format documentation
|
2
2
|
--color
|
data/Gemfile.lock
CHANGED
@@ -40,8 +40,6 @@ GEM
|
|
40
40
|
rspec-core (~> 3.5.0)
|
41
41
|
rspec-expectations (~> 3.5.0)
|
42
42
|
rspec-mocks (~> 3.5.0)
|
43
|
-
rspec-collection_matchers (1.1.2)
|
44
|
-
rspec-expectations (>= 2.99.0.beta1)
|
45
43
|
rspec-core (3.5.2)
|
46
44
|
rspec-support (~> 3.5.0)
|
47
45
|
rspec-expectations (3.5.0)
|
@@ -72,7 +70,6 @@ DEPENDENCIES
|
|
72
70
|
codeclimate-test-reporter
|
73
71
|
optimizely_server_side!
|
74
72
|
rspec (~> 3.5)
|
75
|
-
rspec-collection_matchers (~> 1.1, >= 1.1.2)
|
76
73
|
webmock (~> 2.1)
|
77
74
|
|
78
75
|
BUNDLED WITH
|
data/Readme.md
CHANGED
@@ -29,7 +29,7 @@ This gem solves few things:
|
|
29
29
|
|
30
30
|
### Architecture
|
31
31
|
|
32
|
-
![alt
|
32
|
+
![alt Architecture](https://github.com/ankit8898/optimizely_server_side/blob/master/docs/general_architecture.png
|
33
33
|
"Architecture")
|
34
34
|
|
35
35
|
### Getting Started
|
@@ -125,7 +125,24 @@ class Foo
|
|
125
125
|
end
|
126
126
|
end
|
127
127
|
```
|
128
|
+
#### Don't want to stick with variation_one, variation_two ?
|
128
129
|
|
130
|
+
You can call you own method names with `variation_` . Below i have `config.variation_best_experience` and `config.variation_pathetic_experience`.
|
131
|
+
|
132
|
+
|
133
|
+
```ruby
|
134
|
+
# in any app/view/foo.html.erb
|
135
|
+
<% experiment(EXPERIMENT_KEY) do |config| %>
|
136
|
+
<% config.variation_best_experience(VARIATION_ONE_KEY) do %>
|
137
|
+
<%= render partial: 'variation_one_experience'
|
138
|
+
<% end %>
|
139
|
+
|
140
|
+
<% config.variation_pathetic_experience(VARIATION_DEFAULT_KEY, primary: true) do %>
|
141
|
+
<%= render partial: 'variation_default_experience'
|
142
|
+
<% end %>
|
143
|
+
<% end %>
|
144
|
+
|
145
|
+
```
|
129
146
|
In the above examples:
|
130
147
|
|
131
148
|
`EXPERIMENT_KEY`: When you will set your experiment this key will be set up that time at https://app.optimizely.com.
|
@@ -138,7 +155,7 @@ In the above examples:
|
|
138
155
|
|
139
156
|
`primary: true` : If you see above some variations are marked with `primary: true`. This enables handling the fallback capabilities of optimizely_server_side. If there is any error pulling datafile or experiment is paused the `primary` experience is served. Not setting primary won't give any experience during fallback times. We encourage setting it up.
|
140
157
|
|
141
|
-
![alt
|
158
|
+
![alt Optimizely dashboard](https://github.com/ankit8898/optimizely_server_side/blob/master/docs/screenshot.png "Optimizely dashboard")
|
142
159
|
|
143
160
|
|
144
161
|
### Instrumentation
|
@@ -15,13 +15,14 @@ module OptimizelyServerSide
|
|
15
15
|
|
16
16
|
class << self
|
17
17
|
attr_writer :configuration
|
18
|
-
end
|
19
18
|
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
def configuration
|
20
|
+
@configuration ||= Configuration.new
|
21
|
+
end
|
23
22
|
|
24
|
-
|
25
|
-
|
23
|
+
def configure
|
24
|
+
yield(configuration)
|
25
|
+
end
|
26
26
|
end
|
27
|
+
|
27
28
|
end
|
@@ -12,15 +12,25 @@ module OptimizelyServerSide
|
|
12
12
|
self.applicable_variation
|
13
13
|
end
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
15
|
+
def variation_one(key, opts = {}, &blk)
|
16
|
+
add_variation(key, opts, &blk)
|
17
|
+
end
|
18
|
+
|
19
|
+
def variation_two(key, opts = {}, &blk)
|
20
|
+
add_variation(key, opts, &blk)
|
21
|
+
end
|
22
|
+
|
23
|
+
def variation_default(key, opts = {}, &blk)
|
24
|
+
add_variation(key, opts, &blk)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Support for variation_three, variation_four till variation_n
|
28
|
+
def method_missing(key, *args, &blk)
|
29
|
+
if key.to_s.match('variation_')
|
30
|
+
add_variation(args[0], args[1] || {}, &blk)
|
31
|
+
else
|
32
|
+
super
|
33
|
+
end
|
24
34
|
end
|
25
35
|
|
26
36
|
# Selects and calls the variation which is applicable
|
@@ -2,8 +2,8 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'optimizely_server_side'
|
5
|
-
s.version = '0.0.
|
6
|
-
s.date = '2016-08-
|
5
|
+
s.version = '0.0.7'
|
6
|
+
s.date = '2016-08-15'
|
7
7
|
s.summary = "Optimizely server side. A wrapper on top of optimizely's ruby sdk for easy caching of server side config "
|
8
8
|
s.description = "Optimizely server side. A A/B test wrapper on top of optimizely's ruby sdk for easy caching of server side config and exposing few more utility helpers. Handling of fallbacks and marking primary experiments. "
|
9
9
|
s.authors = ["Ankit Gupta"]
|
@@ -16,7 +16,6 @@ Gem::Specification.new do |s|
|
|
16
16
|
'https://github.com/ankit8898/optimizely_server_side'
|
17
17
|
s.license = 'MIT'
|
18
18
|
s.add_development_dependency 'rspec', '~> 3.5'
|
19
|
-
s.add_development_dependency 'rspec-collection_matchers', '~> 1.1', '>= 1.1.2'
|
20
19
|
s.add_development_dependency 'webmock', '~> 2.1'
|
21
20
|
s.add_runtime_dependency 'optimizely-sdk' , '~> 0.1.1'
|
22
21
|
s.add_runtime_dependency 'activesupport', '~> 4.2', '>= 4.2.6'
|
@@ -37,6 +37,31 @@ RSpec.describe OptimizelyServerSide::Experiment do
|
|
37
37
|
end
|
38
38
|
|
39
39
|
|
40
|
+
context 'when the variation are named anything else' do
|
41
|
+
|
42
|
+
subject { OptimizelyServerSide::Experiment.new(variation_key = 'foobar') }
|
43
|
+
|
44
|
+
let(:some_method) { Proc.new {|n| n*2 } }
|
45
|
+
|
46
|
+
let(:some_html_block) do
|
47
|
+
-> { '<h1>Foo</h1>' }
|
48
|
+
end
|
49
|
+
|
50
|
+
let(:string_blk) { -> { 'Hello!'} }
|
51
|
+
|
52
|
+
|
53
|
+
before do
|
54
|
+
subject.variation_bottom_lead_form('foo', &some_method)
|
55
|
+
|
56
|
+
subject.variation_middle_lead_form('foo_two', primary: true, &some_html_block)
|
57
|
+
|
58
|
+
subject.variation_pathetic_form('foobar', &string_blk)
|
59
|
+
end
|
60
|
+
|
61
|
+
it { expect(subject.applicable_variation).to eq('Hello!') }
|
62
|
+
end
|
63
|
+
|
64
|
+
|
40
65
|
end
|
41
66
|
|
42
67
|
describe '#variation_one' do
|
@@ -141,6 +166,32 @@ RSpec.describe OptimizelyServerSide::Experiment do
|
|
141
166
|
end
|
142
167
|
end
|
143
168
|
|
169
|
+
|
170
|
+
describe '#variation_bottom_lead_form' do
|
171
|
+
|
172
|
+
let(:blk) { -> {'<div><h1>Hello</h1></div>'} }
|
173
|
+
|
174
|
+
before do
|
175
|
+
@variation_instance = subject.variation_bottom_lead_form('foo', primary: true, &blk)
|
176
|
+
end
|
177
|
+
|
178
|
+
it 'returns a variation instance passed' do
|
179
|
+
expect(@variation_instance).to be_kind_of(OptimizelyServerSide::Variation)
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'returns a key of foo' do
|
183
|
+
expect(@variation_instance.key).to eq('foo')
|
184
|
+
end
|
185
|
+
|
186
|
+
it 'returns a content with blk ' do
|
187
|
+
expect(@variation_instance.instance_variable_get(:@content)).to eq(blk)
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'is primary' do
|
191
|
+
expect(@variation_instance.primary).to be(true)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
144
195
|
describe '#variations' do
|
145
196
|
|
146
197
|
context 'key accepts regular strings' do
|
@@ -152,7 +203,7 @@ RSpec.describe OptimizelyServerSide::Experiment do
|
|
152
203
|
end
|
153
204
|
|
154
205
|
it 'holds collection of variations' do
|
155
|
-
expect(subject.instance_variable_get(:@variations)).to
|
206
|
+
expect(subject.instance_variable_get(:@variations).count).to eq(1)
|
156
207
|
end
|
157
208
|
|
158
209
|
it 'is a type of Variation' do
|
@@ -216,7 +267,7 @@ RSpec.describe OptimizelyServerSide::Experiment do
|
|
216
267
|
end
|
217
268
|
|
218
269
|
it 'has all variations' do
|
219
|
-
expect(subject.instance_variable_get(:@variations)).to
|
270
|
+
expect(subject.instance_variable_get(:@variations).count).to eq(3)
|
220
271
|
end
|
221
272
|
|
222
273
|
it 'has all variations of class Variation' do
|
@@ -282,5 +333,21 @@ RSpec.describe OptimizelyServerSide::Experiment do
|
|
282
333
|
it { expect(subject.primary_variation.call).to eq('<h1>Foo</h1>') }
|
283
334
|
end
|
284
335
|
|
336
|
+
|
337
|
+
context 'when test are having own variation names' do
|
338
|
+
|
339
|
+
before do
|
340
|
+
subject.variation_bottom_lead_form('foo', &some_method)
|
341
|
+
|
342
|
+
subject.variation_middle_lead_form('foo_two', primary: true, &some_html_block)
|
343
|
+
|
344
|
+
subject.variation_pathetic_form('foo_three',&string_blk)
|
345
|
+
end
|
346
|
+
|
347
|
+
it { expect(subject.primary_variation).not_to be_nil }
|
348
|
+
|
349
|
+
it { expect(subject.primary_variation.call).to eq('<h1>Foo</h1>') }
|
350
|
+
end
|
351
|
+
|
285
352
|
end
|
286
353
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: optimizely_server_side
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ankit Gupta
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -24,26 +24,6 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '3.5'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rspec-collection_matchers
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '1.1'
|
34
|
-
- - ">="
|
35
|
-
- !ruby/object:Gem::Version
|
36
|
-
version: 1.1.2
|
37
|
-
type: :development
|
38
|
-
prerelease: false
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
40
|
-
requirements:
|
41
|
-
- - "~>"
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: '1.1'
|
44
|
-
- - ">="
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: 1.1.2
|
47
27
|
- !ruby/object:Gem::Dependency
|
48
28
|
name: webmock
|
49
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -106,7 +86,6 @@ files:
|
|
106
86
|
- Gemfile
|
107
87
|
- Gemfile.lock
|
108
88
|
- Readme.md
|
109
|
-
- blocky.rb
|
110
89
|
- docs/general_architecture.png
|
111
90
|
- docs/screenshot.png
|
112
91
|
- lib/optimizely_server_side.rb
|