optimizely_server_side 0.0.12 → 0.0.13
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/Changelog.md +6 -0
- data/Gemfile.lock +1 -1
- data/Readme.md +17 -17
- data/lib/optimizely_server_side/helpers/support.rb +4 -1
- data/optimizely_server_side.gemspec +2 -2
- data/spec/optimizely_server_side/helpers/support_spec.rb +67 -3
- 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: 7b974d9d401c8dff8321737ee17ee14c05799dc6
|
4
|
+
data.tar.gz: 8365698fc538b641ae6aa2938921347d7cfd8675
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 85a8e18f9b8b1cf339d90b824c56bcc56e2671d2811b09406cdd0b45b06e83ce24c8105660dbd96d771704632def7e755588446664e68cbb075ee7a2218b9066
|
7
|
+
data.tar.gz: c8d71fd9d761bb345ff2bd03f5cdae891fea13a3f286c00882824626d23798e03cf3d71d831a83a2eeaaf1c858d8eb7427dfb8ce004b2303d0b40c3a0931d0cf
|
data/Changelog.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
# 0.0.13
|
2
|
+
|
3
|
+
- Adding support for adding additional attributes via experiments.
|
4
|
+
- Adding a feature_flip method which is alias of experiment to distinguish between experiments and on/off feature.
|
5
|
+
|
6
|
+
|
1
7
|
# 0.0.11
|
2
8
|
|
3
9
|
Bug fix. Visitor id should not be passed in attributes.
|
data/Gemfile.lock
CHANGED
data/Readme.md
CHANGED
@@ -101,15 +101,15 @@ class ApplicationController < ActionController::Base
|
|
101
101
|
|
102
102
|
```ruby
|
103
103
|
# in any app/view/foo.html.erb
|
104
|
-
|
104
|
+
<%= experiment(EXPERIMENT_KEY) do |exp|
|
105
105
|
|
106
|
-
|
107
|
-
|
108
|
-
|
106
|
+
exp.variation_one(VARIATION_ONE_KEY) do
|
107
|
+
render partial: 'variation_one_experience'
|
108
|
+
end
|
109
109
|
|
110
|
-
|
111
|
-
|
112
|
-
|
110
|
+
exp.variation_default(VARIATION_DEFAULT_KEY, primary: true)
|
111
|
+
render partial: 'variation_default_experience'
|
112
|
+
end
|
113
113
|
|
114
114
|
<% end %>
|
115
115
|
```
|
@@ -126,13 +126,13 @@ class Foo
|
|
126
126
|
# any other rest endpoint.
|
127
127
|
# Suppose you are doing a AB test on a new endpoint / data source.
|
128
128
|
def get_me_some_data
|
129
|
-
data = experiment(EXPERIMENT_KEY) do |
|
129
|
+
data = experiment(EXPERIMENT_KEY) do |exp|
|
130
130
|
|
131
|
-
|
131
|
+
exp.variation_one(VARIATION_ONE_KEY) do
|
132
132
|
HTTParty.get('http://from_source_a.com/users')
|
133
133
|
end
|
134
134
|
|
135
|
-
|
135
|
+
exp.variation_default(VARIATION_TWO_KEY, primary: true) do
|
136
136
|
HTTParty.get('http://from_source_b.com/users')
|
137
137
|
end
|
138
138
|
end
|
@@ -147,15 +147,15 @@ You can call you own method names with `variation_` . Below i have `config.varia
|
|
147
147
|
|
148
148
|
```ruby
|
149
149
|
# in any app/view/foo.html.erb
|
150
|
-
|
150
|
+
<%= experiment(EXPERIMENT_KEY) do |exp|
|
151
151
|
|
152
|
-
|
153
|
-
|
154
|
-
|
152
|
+
config.variation_best_experience(VARIATION_ONE_KEY) do
|
153
|
+
render partial: 'variation_one_experience'
|
154
|
+
end
|
155
155
|
|
156
|
-
|
157
|
-
|
158
|
-
|
156
|
+
config.variation_pathetic_experience(VARIATION_DEFAULT_KEY, primary: true) do
|
157
|
+
render partial: 'variation_default_experience'
|
158
|
+
end
|
159
159
|
|
160
160
|
<% end %>
|
161
161
|
|
@@ -21,10 +21,13 @@ module OptimizelyServerSide
|
|
21
21
|
# end
|
22
22
|
#
|
23
23
|
# end
|
24
|
-
def experiment(experiment_key, &blk)
|
24
|
+
def experiment(experiment_key, options = {}, &blk)
|
25
|
+
# Merge any other options to user attributes
|
26
|
+
OptimizelyServerSide.configuration.user_attributes.merge!(options.stringify_keys)
|
25
27
|
variation_key = optimizely_sdk_project_instance(experiment_key)
|
26
28
|
OptimizelyServerSide::Experiment.new(experiment_key, variation_key).start(&blk)
|
27
29
|
end
|
30
|
+
alias_method :feature_flip, :experiment
|
28
31
|
|
29
32
|
def optimizely_sdk_project_instance(experiment_key)
|
30
33
|
OptimizelyServerSide::OptimizelySdk
|
@@ -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-
|
5
|
+
s.version = '0.0.13'
|
6
|
+
s.date = '2016-09-11'
|
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"]
|
@@ -8,12 +8,28 @@ RSpec.describe OptimizelyServerSide::Support do
|
|
8
8
|
puts "Do nothing with #{url} and #{params}"
|
9
9
|
end
|
10
10
|
end
|
11
|
+
|
11
12
|
class FakeKlass
|
12
13
|
|
13
14
|
include OptimizelyServerSide::Support
|
14
15
|
|
16
|
+
def method_two_with_options
|
17
|
+
|
18
|
+
experiment('bar_experiment_key', state_code: 'ca', device_type: 'iPhone') do |config|
|
15
19
|
|
16
|
-
|
20
|
+
config.variation_one('variation_one') do
|
21
|
+
'Experience one'
|
22
|
+
end
|
23
|
+
|
24
|
+
config.variation_two('variation_two') do
|
25
|
+
'Experience two'
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
def method_one
|
17
33
|
|
18
34
|
experiment('foo_experiment_key') do |config|
|
19
35
|
|
@@ -27,6 +43,19 @@ RSpec.describe OptimizelyServerSide::Support do
|
|
27
43
|
|
28
44
|
end
|
29
45
|
end
|
46
|
+
|
47
|
+
|
48
|
+
def method_with_feature_flip
|
49
|
+
|
50
|
+
feature_flip('baz_experiment_key') do |config|
|
51
|
+
|
52
|
+
config.variation_one('variation_one') do
|
53
|
+
'Experience one'
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
30
59
|
end
|
31
60
|
|
32
61
|
|
@@ -41,7 +70,7 @@ RSpec.describe OptimizelyServerSide::Support do
|
|
41
70
|
allow(subject).to receive(:optimizely_sdk_project_instance).and_return('variation_one')
|
42
71
|
end
|
43
72
|
|
44
|
-
it { expect(subject.
|
73
|
+
it { expect(subject.method_one).to eq('Experience one')}
|
45
74
|
end
|
46
75
|
|
47
76
|
|
@@ -67,7 +96,42 @@ RSpec.describe OptimizelyServerSide::Support do
|
|
67
96
|
end
|
68
97
|
|
69
98
|
|
70
|
-
it { expect(subject.
|
99
|
+
it { expect(subject.method_one).to be_nil }
|
71
100
|
end
|
101
|
+
|
102
|
+
|
103
|
+
context 'when a options hash is passed' do
|
104
|
+
|
105
|
+
|
106
|
+
before do
|
107
|
+
subject.method_two_with_options
|
108
|
+
end
|
109
|
+
|
110
|
+
# Reset to empty
|
111
|
+
after do
|
112
|
+
OptimizelyServerSide.configuration.user_attributes = {}
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'hash no user attributes when not passed' do
|
116
|
+
expect(OptimizelyServerSide.configuration.user_attributes).to eq({'state_code' => 'ca', 'device_type' => 'iPhone'})
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
describe '#feature_flip' do
|
123
|
+
|
124
|
+
subject { FakeKlass.new }
|
125
|
+
|
126
|
+
|
127
|
+
context 'feature flip' do
|
128
|
+
|
129
|
+
before do
|
130
|
+
allow(subject).to receive(:optimizely_sdk_project_instance).and_return('variation_one')
|
131
|
+
end
|
132
|
+
|
133
|
+
it { expect(subject.method_with_feature_flip).to eq('Experience one')}
|
134
|
+
end
|
135
|
+
|
72
136
|
end
|
73
137
|
end
|
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.13
|
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-
|
11
|
+
date: 2016-09-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|