Skip to content

Commit 8a8fb7e

Browse files
author
Michael Ng
authored
refac: Clean up various factory methods to simplify initialization. (#206)
1 parent 1b75d2e commit 8a8fb7e

File tree

5 files changed

+42
-44
lines changed

5 files changed

+42
-44
lines changed

README.md

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
### Install from github:
99

1010
```$sh
11-
go install github.com/optimizely/go-sdk
11+
go get github.com/optimizely/go-sdk
1212
```
1313

1414
### Install from source:
@@ -29,14 +29,14 @@ module mymodule
2929
go 1.12
3030
3131
require (
32-
github.com/optimizely/go-sdk v1.0.0-beta6
32+
github.com/optimizely/go-sdk v1.0.0-beta7
3333
)
3434
```
3535

3636
If you are already using `go.mod` in your application you can run the following:
3737

3838
```
39-
go mod edit -require github.com/optimizely/[email protected]beta6
39+
go mod edit -require github.com/optimizely/[email protected]beta7
4040
```
4141

4242
NOTE:
@@ -113,3 +113,11 @@ License (MIT): https://github.com/json-iterator/go/blob/master/LICENSE
113113
subset
114114
Copyright (c) 2015, Facebook, Inc. All rights reserved.
115115
License (BSD): https://github.com/facebookarchive/subset/blob/master/license
116+
117+
profile
118+
Copyright (c) 2013 Dave Cheney. All rights reserved.
119+
License (BSD): https://github.com/pkg/profile/blob/master/LICENSE
120+
121+
sync
122+
Copyright (c) 2009 The Go Authors. All rights reserved.
123+
https://github.com/golang/sync/blob/master/LICENSE

examples/main.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,7 @@ func main() {
7070
/************* Setting Polling Interval ********************/
7171

7272
optimizelyClient, _ = optimizelyFactory.Client(
73-
client.WithPollingConfigManager(sdkKey, time.Second, nil),
74-
client.WithCompositeDecisionService(sdkKey),
73+
client.WithPollingConfigManager(time.Second, nil),
7574
client.WithBatchEventProcessor(event.DefaultBatchSize, event.DefaultEventQueueSize, event.DefaultEventFlushInterval),
7675
)
7776
optimizelyClient.Close()

pkg/client/factory.go

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ type OptimizelyFactory struct {
3535

3636
configManager pkg.ProjectConfigManager
3737
decisionService decision.Service
38+
eventDispatcher event.Dispatcher
3839
eventProcessor event.Processor
3940
executionCtx utils.ExecutionCtx
4041
userProfileService decision.UserProfileService
@@ -70,25 +71,25 @@ func (f OptimizelyFactory) Client(clientOptions ...OptionFunc) (*OptimizelyClien
7071
appClient.ConfigManager = config.NewPollingProjectConfigManager(
7172
f.SDKKey,
7273
config.WithInitialDatafile(f.Datafile),
73-
config.WithPollingInterval(config.DefaultPollingInterval),
7474
)
7575
}
7676

7777
if f.eventProcessor != nil {
7878
appClient.EventProcessor = f.eventProcessor
7979
} else {
80-
appClient.EventProcessor = event.NewBatchEventProcessor(
81-
event.WithBatchSize(event.DefaultBatchSize),
82-
event.WithQueueSize(event.DefaultEventQueueSize),
83-
event.WithFlushInterval(event.DefaultEventFlushInterval),
80+
var eventProcessorOptions = []event.BPOptionConfig{
8481
event.WithSDKKey(f.SDKKey),
85-
)
82+
}
83+
if f.eventDispatcher != nil {
84+
eventProcessorOptions = append(eventProcessorOptions, event.WithEventDispatcher(f.eventDispatcher))
85+
}
86+
appClient.EventProcessor = event.NewBatchEventProcessor(eventProcessorOptions...)
8687
}
8788

8889
if f.decisionService != nil {
8990
appClient.DecisionService = f.decisionService
9091
} else {
91-
experimentServiceOptions := []decision.CESOptionFunc{}
92+
var experimentServiceOptions []decision.CESOptionFunc
9293
if f.userProfileService != nil {
9394
experimentServiceOptions = append(experimentServiceOptions, decision.WithUserProfileService(f.userProfileService))
9495
}
@@ -113,35 +114,20 @@ func (f OptimizelyFactory) Client(clientOptions ...OptionFunc) (*OptimizelyClien
113114
}
114115

115116
// WithPollingConfigManager sets polling config manager on a client.
116-
func WithPollingConfigManager(sdkKey string, pollingInterval time.Duration, initDataFile []byte) OptionFunc {
117+
func WithPollingConfigManager(pollingInterval time.Duration, initDataFile []byte) OptionFunc {
117118
return func(f *OptimizelyFactory) {
118-
f.configManager = config.NewPollingProjectConfigManager(sdkKey, config.WithInitialDatafile(initDataFile),
119+
f.configManager = config.NewPollingProjectConfigManager(f.SDKKey, config.WithInitialDatafile(initDataFile),
119120
config.WithPollingInterval(pollingInterval))
120121
}
121122
}
122123

123-
// WithPollingConfigManagerRequester sets polling config manager on a client.
124-
func WithPollingConfigManagerRequester(requester utils.Requester, pollingInterval time.Duration, initDataFile []byte) OptionFunc {
125-
return func(f *OptimizelyFactory) {
126-
f.configManager = config.NewPollingProjectConfigManager("", config.WithInitialDatafile(initDataFile),
127-
config.WithPollingInterval(pollingInterval), config.WithRequester(requester))
128-
}
129-
}
130-
131124
// WithConfigManager sets polling config manager on a client.
132125
func WithConfigManager(configManager pkg.ProjectConfigManager) OptionFunc {
133126
return func(f *OptimizelyFactory) {
134127
f.configManager = configManager
135128
}
136129
}
137130

138-
// WithCompositeDecisionService sets decision service on a client.
139-
func WithCompositeDecisionService(sdkKey string) OptionFunc {
140-
return func(f *OptimizelyFactory) {
141-
f.decisionService = decision.NewCompositeService(sdkKey)
142-
}
143-
}
144-
145131
// WithDecisionService sets decision service on a client.
146132
func WithDecisionService(decisionService decision.Service) OptionFunc {
147133
return func(f *OptimizelyFactory) {
@@ -178,6 +164,13 @@ func WithEventProcessor(eventProcessor event.Processor) OptionFunc {
178164
}
179165
}
180166

167+
// WithEventDispatcher sets event dispatcher on the factory.
168+
func WithEventDispatcher(eventDispatcher event.Dispatcher) OptionFunc {
169+
return func(f *OptimizelyFactory) {
170+
f.eventDispatcher = eventDispatcher
171+
}
172+
}
173+
181174
// WithExecutionContext allows user to pass in their own execution context to override the default one in the client.
182175
func WithExecutionContext(executionContext utils.ExecutionCtx) OptionFunc {
183176
return func(f *OptimizelyFactory) {
@@ -210,7 +203,6 @@ func (f OptimizelyFactory) StaticClient() (*OptimizelyClient, error) {
210203

211204
optlyClient, e := f.Client(
212205
WithConfigManager(configManager),
213-
WithCompositeDecisionService(f.SDKKey),
214206
WithBatchEventProcessor(event.DefaultBatchSize, event.DefaultEventQueueSize, event.DefaultEventFlushInterval),
215207
)
216208
return optlyClient, e

pkg/client/factory_test.go

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -74,20 +74,7 @@ func TestClientWithSDKKey(t *testing.T) {
7474
func TestClientWithPollingConfigManager(t *testing.T) {
7575
factory := OptimizelyFactory{}
7676

77-
optimizelyClient, err := factory.Client(WithPollingConfigManager("1212", time.Hour, nil))
78-
assert.NoError(t, err)
79-
assert.NotNil(t, optimizelyClient.ConfigManager)
80-
assert.NotNil(t, optimizelyClient.DecisionService)
81-
assert.NotNil(t, optimizelyClient.EventProcessor)
82-
}
83-
84-
func TestClientWithPollingConfigManagerRequester(t *testing.T) {
85-
86-
factory := OptimizelyFactory{}
87-
mockRequester := new(MockRequester)
88-
mockRequester.On("Get", []utils.Header(nil)).Return([]byte(`{"revision":"42"}`), http.Header{}, http.StatusOK, nil)
89-
90-
optimizelyClient, err := factory.Client(WithPollingConfigManagerRequester(mockRequester, time.Minute, nil))
77+
optimizelyClient, err := factory.Client(WithPollingConfigManager(time.Hour, nil))
9178
assert.NoError(t, err)
9279
assert.NotNil(t, optimizelyClient.ConfigManager)
9380
assert.NotNil(t, optimizelyClient.DecisionService)
@@ -162,3 +149,14 @@ func TestClientWithCustomDecisionServiceOptions(t *testing.T) {
162149
assert.NoError(t, err)
163150
assert.NotNil(t, optimizelyClient.DecisionService)
164151
}
152+
153+
func TestClientWithEventDispatcher(t *testing.T) {
154+
factory := OptimizelyFactory{SDKKey: "1212"}
155+
156+
mockEventDispatcher := new(MockDispatcher)
157+
optimizelyClient, err := factory.Client(WithEventDispatcher(mockEventDispatcher))
158+
assert.NoError(t, err)
159+
160+
dispatcher := optimizelyClient.EventProcessor.(*event.BatchEventProcessor).EventDispatcher
161+
assert.Equal(t, dispatcher, mockEventDispatcher)
162+
}

pkg/decision/persisting_experiment_service.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,5 +97,6 @@ func (p PersistingExperimentService) saveDecision(userProfile UserProfile, exper
9797
}
9898
userProfile.ExperimentBucketMap[decisionKey] = decision.Variation.ID
9999
p.userProfileService.Save(userProfile)
100+
pesLogger.Debug(fmt.Sprintf(`Decision saved for user "%s".`, userProfile.ID))
100101
}
101102
}

0 commit comments

Comments
 (0)