Skip to content

Commit 947bf00

Browse files
Merge pull request #81 from optimizely/pawel/linters-fix
added linter definition file
2 parents 55690db + 23a8eef commit 947bf00

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+474
-153
lines changed

.golangci.yml

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
linters-settings:
2+
govet:
3+
check-shadowing: true
4+
golint:
5+
min-confidence: 0
6+
gocyclo:
7+
min-complexity: 16
8+
maligned:
9+
suggest-new: true
10+
dupl:
11+
threshold: 100
12+
goconst:
13+
min-len: 2
14+
min-occurrences: 2
15+
misspell:
16+
locale: US
17+
lll:
18+
line-length: 140
19+
gocritic:
20+
enabled-tags:
21+
- performance
22+
- style
23+
- experimental
24+
disabled-checks:
25+
- wrapperFunc
26+
- hugeParam
27+
- rangeValCopy
28+
29+
linters:
30+
disable-all: true
31+
enable:
32+
- megacheck
33+
- golint
34+
- govet
35+
- unconvert
36+
- megacheck
37+
- structcheck
38+
- gas
39+
- gocyclo
40+
- dupl
41+
- misspell
42+
- unparam
43+
- varcheck
44+
- deadcode
45+
- typecheck
46+
- ineffassign
47+
- varcheck
48+
- stylecheck
49+
#- gochecknoinits
50+
- scopelint
51+
- gocritic
52+
- golint
53+
- nakedret
54+
- gosimple
55+
- prealloc
56+
- maligned
57+
fast: false
58+
59+
run:
60+
skip-dirs:
61+
- vendor
62+
concurrency: 4
63+
64+
issues:
65+
exclude-rules:
66+
- text: "weak cryptographic primitive"
67+
linters:
68+
- gosec
69+
exclude-use-default: false
70+
71+
service:
72+
golangci-lint-version: 1.17.x

optimizely/client/client.go

Lines changed: 40 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
* limitations under the License. *
1515
***************************************************************************/
1616

17+
// Package client has client definitions
1718
package client
1819

1920
import (
@@ -37,7 +38,7 @@ var logger = logging.GetLogger("Client")
3738
// OptimizelyClient is the entry point to the Optimizely SDK
3839
type OptimizelyClient struct {
3940
configManager optimizely.ProjectConfigManager
40-
decisionService decision.DecisionService
41+
decisionService decision.Service
4142
eventProcessor event.Processor
4243
isValid bool
4344

@@ -55,15 +56,16 @@ func (o *OptimizelyClient) IsFeatureEnabled(featureKey string, userContext entit
5556
}
5657
}()
5758

58-
if isValid, err := o.isValidClient("IsFeatureEnabled"); !isValid {
59+
var isValid bool
60+
if isValid, err = o.isValidClient("IsFeatureEnabled"); !isValid {
5961
return false, err
6062
}
6163

6264
projectConfig := o.configManager.GetConfig()
63-
feature, err := projectConfig.GetFeatureByKey(featureKey)
64-
if err != nil {
65-
logger.Error("Error retrieving feature", err)
66-
return result, err
65+
feature, e := projectConfig.GetFeatureByKey(featureKey)
66+
if e != nil {
67+
logger.Error("Error retrieving feature", e)
68+
return result, e
6769
}
6870
featureDecisionContext := decision.FeatureDecisionContext{
6971
Feature: &feature,
@@ -72,14 +74,14 @@ func (o *OptimizelyClient) IsFeatureEnabled(featureKey string, userContext entit
7274

7375
userID := userContext.ID
7476
logger.Debug(fmt.Sprintf(`Evaluating feature "%s" for user "%s".`, featureKey, userID))
75-
featureDecision, err := o.decisionService.GetFeatureDecision(featureDecisionContext, userContext)
77+
featureDecision, e1 := o.decisionService.GetFeatureDecision(featureDecisionContext, userContext)
7678

77-
if err != nil {
78-
logger.Error("Received an error while computing feature decision", err)
79-
return result, err
79+
if e1 != nil {
80+
logger.Error("received an error while computing feature decision", e1)
81+
return result, e1
8082
}
8183

82-
result = (featureDecision.Variation.FeatureEnabled == true)
84+
result = featureDecision.Variation.FeatureEnabled
8385
if result {
8486
logger.Info(fmt.Sprintf(`Feature "%s" is enabled for user "%s".`, featureKey, userID))
8587
} else {
@@ -99,7 +101,7 @@ func (o *OptimizelyClient) GetEnabledFeatures(userContext entities.UserContext)
99101

100102
defer func() {
101103
if r := recover(); r != nil {
102-
errorMessage := fmt.Sprintf(`Optimizely SDK is panicking with the error "%s"`, string(debug.Stack()))
104+
errorMessage := fmt.Sprintf(`optimizely SDK is panicking with the error "%s"`, string(debug.Stack()))
103105
err = errors.New(errorMessage)
104106
logger.Error(errorMessage, err)
105107
}
@@ -125,15 +127,15 @@ func (o *OptimizelyClient) GetEnabledFeatures(userContext entities.UserContext)
125127
// Track take and event key with event tags and if the event is part of the config, send to events backend.
126128
func (o *OptimizelyClient) Track(eventKey string, userContext entities.UserContext, eventTags map[string]interface{}) (err error) {
127129
if !o.isValid {
128-
errorMessage := "Optimizely instance is not valid. Failing GetEnabledFeatures."
130+
errorMessage := "optimizely instance is not valid; failing GetEnabledFeatures"
129131
err = errors.New(errorMessage)
130132
logger.Error(errorMessage, err)
131133
return err
132134
}
133135

134136
defer func() {
135137
if r := recover(); r != nil {
136-
errorMessage := fmt.Sprintf(`Optimizely SDK is panicking with the error "%s"`, string(debug.Stack()))
138+
errorMessage := fmt.Sprintf(`optimizely SDK is panicking with the error "%s"`, string(debug.Stack()))
137139
err = errors.New(errorMessage)
138140
logger.Error(errorMessage, err)
139141
}
@@ -145,7 +147,7 @@ func (o *OptimizelyClient) Track(eventKey string, userContext entities.UserConte
145147
userEvent := event.CreateConversionUserEvent(o.configManager.GetConfig(), configEvent, userContext, eventTags)
146148
o.eventProcessor.ProcessEvent(userEvent)
147149
} else {
148-
errorMessage := fmt.Sprintf(`Optimizely SDK track: error getting event with key "%s"`, eventKey)
150+
errorMessage := fmt.Sprintf(`optimizely SDK track: error getting event with key "%s"`, eventKey)
149151
logger.Error(errorMessage, eventError)
150152
return eventError
151153
}
@@ -154,82 +156,83 @@ func (o *OptimizelyClient) Track(eventKey string, userContext entities.UserConte
154156
}
155157

156158
// GetFeatureVariableBoolean returns boolean feature variable value
157-
func (o *OptimizelyClient) GetFeatureVariableBoolean(featureKey string, variableKey string, userContext entities.UserContext) (value bool, err error) {
159+
func (o *OptimizelyClient) GetFeatureVariableBoolean(featureKey, variableKey string, userContext entities.UserContext) (value bool, err error) {
158160
val, valueType, err := o.getFeatureVariable(featureKey, variableKey, userContext)
159161
if err != nil {
160162
return false, err
161163
}
162164
convertedValue, err := strconv.ParseBool(val)
163165
if err != nil || valueType != entities.Boolean {
164-
return false, fmt.Errorf("Variable value for key %s is invalid or wrong type", variableKey)
166+
return false, fmt.Errorf("variable value for key %s is invalid or wrong type", variableKey)
165167
}
166168
return convertedValue, err
167169
}
168170

169171
// GetFeatureVariableDouble returns double feature variable value
170-
func (o *OptimizelyClient) GetFeatureVariableDouble(featureKey string, variableKey string, userContext entities.UserContext) (value float64, err error) {
172+
func (o *OptimizelyClient) GetFeatureVariableDouble(featureKey, variableKey string, userContext entities.UserContext) (value float64, err error) {
171173
val, valueType, err := o.getFeatureVariable(featureKey, variableKey, userContext)
172174
if err != nil {
173175
return 0, err
174176
}
175177
convertedValue, err := strconv.ParseFloat(val, 64)
176178
if err != nil || valueType != entities.Double {
177-
return 0, fmt.Errorf("Variable value for key %s is invalid or wrong type", variableKey)
179+
return 0, fmt.Errorf("variable value for key %s is invalid or wrong type", variableKey)
178180
}
179181
return convertedValue, err
180182
}
181183

182184
// GetFeatureVariableInteger returns integer feature variable value
183-
func (o *OptimizelyClient) GetFeatureVariableInteger(featureKey string, variableKey string, userContext entities.UserContext) (value int, err error) {
185+
func (o *OptimizelyClient) GetFeatureVariableInteger(featureKey, variableKey string, userContext entities.UserContext) (value int, err error) {
184186
val, valueType, err := o.getFeatureVariable(featureKey, variableKey, userContext)
185187
if err != nil {
186188
return 0, err
187189
}
188190
convertedValue, err := strconv.Atoi(val)
189191
if err != nil || valueType != entities.Integer {
190-
return 0, fmt.Errorf("Variable value for key %s is invalid or wrong type", variableKey)
192+
return 0, fmt.Errorf("variable value for key %s is invalid or wrong type", variableKey)
191193
}
192194
return convertedValue, err
193195
}
194196

195197
// GetFeatureVariableString returns string feature variable value
196-
func (o *OptimizelyClient) GetFeatureVariableString(featureKey string, variableKey string, userContext entities.UserContext) (value string, err error) {
198+
func (o *OptimizelyClient) GetFeatureVariableString(featureKey, variableKey string, userContext entities.UserContext) (value string, err error) {
197199
value, valueType, err := o.getFeatureVariable(featureKey, variableKey, userContext)
198200
if err != nil {
199201
return "", err
200202
}
201203
if valueType != entities.String {
202-
return "", fmt.Errorf("Variable value for key %s is wrong type", variableKey)
204+
return "", fmt.Errorf("variable value for key %s is wrong type", variableKey)
203205
}
204206
return value, err
205207
}
206208

207-
func (o *OptimizelyClient) getFeatureVariable(featureKey string, variableKey string, userContext entities.UserContext) (value string, valueType entities.VariableType, err error) {
209+
func (o *OptimizelyClient) getFeatureVariable(featureKey, variableKey string, userContext entities.UserContext) (value string, valueType entities.VariableType, err error) {
208210

209211
defer func() {
210212
if r := recover(); r != nil {
211-
errorMessage := fmt.Sprintf(`Optimizely SDK is panicking with the error "%s"`, string(debug.Stack()))
213+
errorMessage := fmt.Sprintf(`optimizely SDK is panicking with the error "%s"`, string(debug.Stack()))
212214
err = errors.New(errorMessage)
213215
logger.Error(errorMessage, err)
214216
}
215217
}()
216218

217-
if isValid, err := o.isValidClient("getFeatureVariable"); !isValid {
219+
var isValid bool
220+
if isValid, err = o.isValidClient("getFeatureVariable"); !isValid {
218221
return "", "", err
219222
}
220223

221224
projectConfig := o.configManager.GetConfig()
222225

223-
feature, err := projectConfig.GetFeatureByKey(featureKey)
224-
if err != nil {
225-
logger.Error("Error retrieving feature", err)
226-
return "", "", err
226+
feature, e := projectConfig.GetFeatureByKey(featureKey)
227+
if e != nil {
228+
logger.Error("error retrieving feature", e)
229+
return "", "", e
227230
}
228231

229-
variable, err := projectConfig.GetVariableByKey(featureKey, variableKey)
230-
if err != nil {
231-
logger.Error("Error retrieving variable", err)
232-
return "", "", err
232+
variable, e1 := projectConfig.GetVariableByKey(featureKey, variableKey)
233+
if e1 != nil {
234+
logger.Error("error retrieving variable", e1)
235+
return "", "", e1
233236
}
234237

235238
var featureValue = variable.DefaultValue
@@ -239,8 +242,8 @@ func (o *OptimizelyClient) getFeatureVariable(featureKey string, variableKey str
239242
ProjectConfig: projectConfig,
240243
}
241244

242-
featureDecision, err := o.decisionService.GetFeatureDecision(featureDecisionContext, userContext)
243-
if err == nil {
245+
featureDecision, e2 := o.decisionService.GetFeatureDecision(featureDecisionContext, userContext)
246+
if e2 == nil {
244247
if v, ok := featureDecision.Variation.Variables[variable.ID]; ok && featureDecision.Variation.FeatureEnabled {
245248
featureValue = v.Value
246249
}
@@ -252,7 +255,7 @@ func (o *OptimizelyClient) getFeatureVariable(featureKey string, variableKey str
252255

253256
func (o *OptimizelyClient) isValidClient(methodName string) (result bool, err error) {
254257
if !o.isValid {
255-
errorMessage := fmt.Sprintf("Optimizely instance is not valid. Failing %s.", methodName)
258+
errorMessage := fmt.Sprintf("optimizely instance is not valid. Failing %s.", methodName)
256259
err := errors.New(errorMessage)
257260
logger.Error(errorMessage, nil)
258261
return false, err

optimizely/client/client_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ func (p *MockProjectConfigManager) GetConfig() optimizely.ProjectConfig {
6363
}
6464

6565
type MockDecisionService struct {
66-
decision.DecisionService
66+
decision.Service
6767
mock.Mock
6868
}
6969

optimizely/client/factory.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
* limitations under the License. *
1515
***************************************************************************/
1616

17+
// Package client has client facing factories
1718
package client
1819

1920
import (
@@ -35,7 +36,7 @@ import (
3536
type Options struct {
3637
Context context.Context
3738
ProjectConfigManager optimizely.ProjectConfigManager
38-
DecisionService decision.DecisionService
39+
DecisionService decision.Service
3940
}
4041

4142
// OptimizelyFactory is used to construct an instance of the OptimizelyClient
@@ -97,17 +98,18 @@ func (f OptimizelyFactory) ClientWithOptions(clientOptions Options) (*Optimizely
9798

9899
notificationCenter := notification.NewNotificationCenter()
99100

100-
if clientOptions.ProjectConfigManager != nil {
101+
switch {
102+
case clientOptions.ProjectConfigManager != nil:
101103
client.configManager = clientOptions.ProjectConfigManager
102-
} else if f.SDKKey != "" {
104+
case f.SDKKey != "":
103105
options := config.PollingProjectConfigManagerOptions{
104106
Datafile: f.Datafile,
105107
}
106108
client.configManager = config.NewPollingProjectConfigManagerWithOptions(ctx, f.SDKKey, options)
107-
} else if f.Datafile != nil {
109+
case f.Datafile != nil:
108110
staticConfigManager, _ := config.NewStaticProjectConfigManagerFromPayload(f.Datafile)
109111
client.configManager = staticConfigManager
110-
} else {
112+
default:
111113
return client, errors.New("unable to instantiate client: no project config manager, SDK key, or a Datafile provided")
112114
}
113115

optimizely/config/datafileprojectconfig/config.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
* limitations under the License. *
1515
***************************************************************************/
1616

17+
// Package datafileprojectconfig //
1718
package datafileprojectconfig
1819

1920
import (
@@ -30,19 +31,19 @@ var logger = logging.GetLogger("DatafileProjectConfig")
3031
// DatafileProjectConfig is a project config backed by a datafile
3132
type DatafileProjectConfig struct {
3233
accountID string
33-
anonymizeIP bool
34-
attributeKeyToIDMap map[string]string
34+
projectID string
35+
revision string
36+
experimentKeyToIDMap map[string]string
3537
audienceMap map[string]entities.Audience
3638
attributeMap map[string]entities.Attribute
37-
botFiltering bool
3839
eventMap map[string]entities.Event
39-
experimentKeyToIDMap map[string]string
40+
attributeKeyToIDMap map[string]string
4041
experimentMap map[string]entities.Experiment
4142
featureMap map[string]entities.Feature
4243
groupMap map[string]entities.Group
43-
projectID string
44-
revision string
4544
rolloutMap map[string]entities.Rollout
45+
anonymizeIP bool
46+
botFiltering bool
4647
}
4748

4849
// GetProjectID returns projectID
@@ -122,10 +123,10 @@ func (c DatafileProjectConfig) GetFeatureByKey(featureKey string) (entities.Feat
122123
}
123124

124125
// GetVariableByKey returns the featureVariable with the given key
125-
func (c DatafileProjectConfig) GetVariableByKey(featureKey string, variableKey string) (entities.Variable, error) {
126+
func (c DatafileProjectConfig) GetVariableByKey(featureKey, variableKey string) (entities.Variable, error) {
126127

127128
var variable entities.Variable
128-
var err = fmt.Errorf("Variable with key %s not found", featureKey)
129+
var err = fmt.Errorf("variable with key %s not found", featureKey)
129130
if feature, ok := c.featureMap[featureKey]; ok {
130131
for _, v := range feature.Variables {
131132
if v.Key == variableKey {

0 commit comments

Comments
 (0)