Skip to content

Commit 9c5d833

Browse files
authored
refactor: Deprecate GetApiInstance & Add Direct NewDefaultClient implementations (#421)
Signed-off-by: Jordan Blacker <[email protected]>
1 parent 3d2b707 commit 9c5d833

File tree

11 files changed

+74
-68
lines changed

11 files changed

+74
-68
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ This is essential for robust experimentation powered by feature flags.
181181
For example, a flag enhancing the appearance of a UI component might drive user engagement to a new feature; to test this hypothesis, telemetry collected by a [hook](#hooks) or [provider](#providers) can be associated with telemetry reported in the client's `track` function.
182182

183183
```go
184-
// initilize a client
184+
// initialize a client
185185
client := openfeature.NewClient('my-app')
186186

187187
// trigger tracking event action
@@ -261,7 +261,7 @@ openfeature.SetProviderAndWait(NewLocalProvider())
261261
openfeature.SetNamedProvider("clientForCache", NewCachedProvider())
262262

263263
// A Client backed by default provider
264-
clientWithDefault := openfeature.NewClient("")
264+
clientWithDefault := openfeature.NewDefaultClient()
265265
// A Client backed by NewCachedProvider
266266
clientForCache := openfeature.NewClient("clientForCache")
267267
```
@@ -291,7 +291,7 @@ var providerErrorCallback = func(details openfeature.EventDetails) {
291291
// callback implementation
292292
}
293293

294-
client := openfeature.NewClient("clientName")
294+
client := openfeature.NewDefaultClient()
295295

296296
// Client event handler
297297
client.AddHandler(openfeature.ProviderError, &providerErrorCallback)
@@ -453,7 +453,7 @@ import (
453453
)
454454

455455
testProvider := NewTestProvider()
456-
err := openfeature.GetApiInstance().SetProviderAndWait(testProvider)
456+
err := openfeature.SetProviderAndWait(testProvider)
457457
if err != nil {
458458
t.Errorf("unable to set provider")
459459
}

e2e/evaluation_fuzz_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ func setupFuzzClient(f *testing.F) *openfeature.Client {
1818
f.Errorf("error setting up provider %v", err)
1919
}
2020

21-
return openfeature.GetApiInstance().GetNamedClient(f.Name()).(*openfeature.Client)
21+
return openfeature.NewClient(f.Name())
2222
}
2323

2424
func FuzzBooleanEvaluation(f *testing.F) {

e2e/evaluation_test.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ func aBooleanFlagWithKeyIsEvaluatedWithDefaultValue(
109109
return ctx, errors.New("default value must be of type bool")
110110
}
111111

112-
got, err := openfeature.GetApiInstance().GetNamedClient("evaluation-test").BooleanValue(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
112+
got, err := openfeature.NewClient("evaluation-test").BooleanValue(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
113113
if err != nil {
114114
return ctx, fmt.Errorf("openfeature client: %w", err)
115115
}
@@ -138,7 +138,7 @@ func theResolvedBooleanValueShouldBe(ctx context.Context, expectedValueStr strin
138138
func aStringFlagWithKeyIsEvaluatedWithDefaultValue(
139139
ctx context.Context, flagKey, defaultValue string,
140140
) (context.Context, error) {
141-
got, err := openfeature.GetApiInstance().GetNamedClient("evaluation-test").StringValue(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
141+
got, err := openfeature.NewClient("evaluation-test").StringValue(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
142142
if err != nil {
143143
return ctx, fmt.Errorf("openfeature client: %w", err)
144144
}
@@ -162,7 +162,7 @@ func theResolvedStringValueShouldBe(ctx context.Context, expectedValue string) e
162162
func anIntegerFlagWithKeyIsEvaluatedWithDefaultValue(
163163
ctx context.Context, flagKey string, defaultValue int64,
164164
) (context.Context, error) {
165-
got, err := openfeature.GetApiInstance().GetNamedClient("evaluation-test").IntValue(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
165+
got, err := openfeature.NewClient("evaluation-test").IntValue(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
166166
if err != nil {
167167
return ctx, fmt.Errorf("openfeature client: %w", err)
168168
}
@@ -186,7 +186,7 @@ func theResolvedIntegerValueShouldBe(ctx context.Context, expectedValue int64) e
186186
func aFloatFlagWithKeyIsEvaluatedWithDefaultValue(
187187
ctx context.Context, flagKey string, defaultValue float64,
188188
) (context.Context, error) {
189-
got, err := openfeature.GetApiInstance().GetNamedClient("evaluation-test").FloatValue(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
189+
got, err := openfeature.NewClient("evaluation-test").FloatValue(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
190190
if err != nil {
191191
return ctx, fmt.Errorf("openfeature client: %w", err)
192192
}
@@ -208,7 +208,7 @@ func theResolvedFloatValueShouldBe(ctx context.Context, expectedValue float64) e
208208
}
209209

210210
func anObjectFlagWithKeyIsEvaluatedWithANullDefaultValue(ctx context.Context, flagKey string) (context.Context, error) {
211-
got, err := openfeature.GetApiInstance().GetNamedClient("evaluation-test").ObjectValue(ctx, flagKey, nil, openfeature.EvaluationContext{})
211+
got, err := openfeature.NewClient("evaluation-test").ObjectValue(ctx, flagKey, nil, openfeature.EvaluationContext{})
212212
if err != nil {
213213
return ctx, fmt.Errorf("openfeature client: %w", err)
214214
}
@@ -270,7 +270,7 @@ func aBooleanFlagWithKeyIsEvaluatedWithDetailsAndDefaultValue(
270270
return ctx, errors.New("default value must be of type bool")
271271
}
272272

273-
got, err := openfeature.GetApiInstance().GetNamedClient("evaluation-test").BooleanValueDetails(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
273+
got, err := openfeature.NewClient("evaluation-test").BooleanValueDetails(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
274274
if err != nil {
275275
return ctx, fmt.Errorf("openfeature client: %w", err)
276276
}
@@ -314,7 +314,7 @@ func theResolvedBooleanDetailsValueShouldBeTheVariantShouldBeAndTheReasonShouldB
314314
func aStringFlagWithKeyIsEvaluatedWithDetailsAndDefaultValue(
315315
ctx context.Context, flagKey, defaultValue string,
316316
) (context.Context, error) {
317-
got, err := openfeature.GetApiInstance().GetNamedClient("evaluation-test").StringValueDetails(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
317+
got, err := openfeature.NewClient("evaluation-test").StringValueDetails(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
318318
if err != nil {
319319
return ctx, fmt.Errorf("openfeature client: %w", err)
320320
}
@@ -353,7 +353,7 @@ func theResolvedStringDetailsValueShouldBeTheVariantShouldBeAndTheReasonShouldBe
353353
func anIntegerFlagWithKeyIsEvaluatedWithDetailsAndDefaultValue(
354354
ctx context.Context, flagKey string, defaultValue int64,
355355
) (context.Context, error) {
356-
got, err := openfeature.GetApiInstance().GetNamedClient("evaluation-test").IntValueDetails(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
356+
got, err := openfeature.NewClient("evaluation-test").IntValueDetails(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
357357
if err != nil {
358358
return ctx, fmt.Errorf("openfeature client: %w", err)
359359
}
@@ -392,7 +392,7 @@ func theResolvedIntegerDetailsValueShouldBeTheVariantShouldBeAndTheReasonShouldB
392392
func aFloatFlagWithKeyIsEvaluatedWithDetailsAndDefaultValue(
393393
ctx context.Context, flagKey string, defaultValue float64,
394394
) (context.Context, error) {
395-
got, err := openfeature.GetApiInstance().GetNamedClient("evaluation-test").FloatValueDetails(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
395+
got, err := openfeature.NewClient("evaluation-test").FloatValueDetails(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
396396
if err != nil {
397397
return ctx, fmt.Errorf("openfeature client: %w", err)
398398
}
@@ -431,7 +431,7 @@ func theResolvedFloatDetailsValueShouldBeTheVariantShouldBeAndTheReasonShouldBe(
431431
func anObjectFlagWithKeyIsEvaluatedWithDetailsAndANullDefaultValue(
432432
ctx context.Context, flagKey string,
433433
) (context.Context, error) {
434-
got, err := openfeature.GetApiInstance().GetNamedClient("evaluation-test").ObjectValueDetails(ctx, flagKey, nil, openfeature.EvaluationContext{})
434+
got, err := openfeature.NewClient("evaluation-test").ObjectValueDetails(ctx, flagKey, nil, openfeature.EvaluationContext{})
435435
if err != nil {
436436
return ctx, fmt.Errorf("openfeature client: %w", err)
437437
}
@@ -538,7 +538,7 @@ func aFlagWithKeyIsEvaluatedWithDefaultValue(
538538
return ctx, errors.New("no contextAwareEvaluationData found")
539539
}
540540

541-
got, err := openfeature.GetApiInstance().GetNamedClient("evaluation-test").StringValue(ctx, flagKey, defaultValue, ctxAwareEvalData.evaluationContext)
541+
got, err := openfeature.NewClient("evaluation-test").StringValue(ctx, flagKey, defaultValue, ctxAwareEvalData.evaluationContext)
542542
if err != nil {
543543
return ctx, fmt.Errorf("openfeature client: %w", err)
544544
}
@@ -568,7 +568,7 @@ func theResolvedFlagValueIsWhenTheContextIsEmpty(ctx context.Context, expectedRe
568568
return errors.New("no contextAwareEvaluationData found")
569569
}
570570

571-
got, err := openfeature.GetApiInstance().GetNamedClient("evaluation-test").StringValue(
571+
got, err := openfeature.NewClient("evaluation-test").StringValue(
572572
ctx, ctxAwareEvalData.flagKey, ctxAwareEvalData.defaultValue, openfeature.EvaluationContext{},
573573
)
574574
if err != nil {
@@ -585,7 +585,7 @@ func theResolvedFlagValueIsWhenTheContextIsEmpty(ctx context.Context, expectedRe
585585
func aNonexistentStringFlagWithKeyIsEvaluatedWithDetailsAndADefaultValue(
586586
ctx context.Context, flagKey, defaultValue string,
587587
) (context.Context, error) {
588-
got, err := openfeature.GetApiInstance().GetNamedClient("evaluation-test").StringValueDetails(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
588+
got, err := openfeature.NewClient("evaluation-test").StringValueDetails(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
589589

590590
return context.WithValue(ctx, ctxStorageKey{}, stringFlagNotFoundData{
591591
evalDetails: got,
@@ -642,7 +642,7 @@ func theReasonShouldIndicateAnErrorAndTheErrorCodeShouldIndicateAMissingFlagWith
642642
func aStringFlagWithKeyIsEvaluatedAsAnIntegerWithDetailsAndADefaultValue(
643643
ctx context.Context, flagKey string, defaultValue int64,
644644
) (context.Context, error) {
645-
got, err := openfeature.GetApiInstance().GetNamedClient("evaluation-test").IntValueDetails(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
645+
got, err := openfeature.NewClient("evaluation-test").IntValueDetails(ctx, flagKey, defaultValue, openfeature.EvaluationContext{})
646646

647647
return context.WithValue(ctx, ctxStorageKey{}, typeErrorData{
648648
evalDetails: got,

openfeature/client_test.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,7 +1202,7 @@ func TestRequirement_1_7_1(t *testing.T) {
12021202
func TestRequirement_1_7_2(t *testing.T) {
12031203
t.Cleanup(initSingleton)
12041204

1205-
if GetApiInstance().GetNamedClient(t.Name()).State() != NotReadyState {
1205+
if NewClient(t.Name()).State() != NotReadyState {
12061206
t.Fatalf("expected client to report NOT READY state")
12071207
}
12081208

@@ -1220,7 +1220,7 @@ func TestRequirement_1_7_2(t *testing.T) {
12201220
t.Fatalf("failed to set up provider: %v", err)
12211221
}
12221222

1223-
if GetApiInstance().GetNamedClient(t.Name()).State() != ReadyState {
1223+
if NewClient(t.Name()).State() != ReadyState {
12241224
t.Fatalf("expected client to report READY state")
12251225
}
12261226
}
@@ -1244,7 +1244,7 @@ func TestRequirement_1_7_3(t *testing.T) {
12441244
}
12451245

12461246
_ = SetNamedProviderAndWait(t.Name(), provider)
1247-
if GetApiInstance().GetNamedClient(t.Name()).State() != ErrorState {
1247+
if NewClient(t.Name()).State() != ErrorState {
12481248
t.Fatalf("expected client to report ERROR state")
12491249
}
12501250
}
@@ -1269,7 +1269,7 @@ func TestRequirement_1_7_4(t *testing.T) {
12691269

12701270
_ = SetNamedProviderAndWait(t.Name(), provider)
12711271

1272-
if GetApiInstance().GetNamedClient(t.Name()).State() != ErrorState {
1272+
if NewClient(t.Name()).State() != ErrorState {
12731273
t.Fatalf("expected client to report ERROR state")
12741274
}
12751275
}
@@ -1294,7 +1294,7 @@ func TestRequirement_1_7_5(t *testing.T) {
12941294

12951295
_ = SetNamedProviderAndWait(t.Name(), provider)
12961296

1297-
if GetApiInstance().GetNamedClient(t.Name()).State() != FatalState {
1297+
if NewClient(t.Name()).State() != FatalState {
12981298
t.Fatalf("expected client to report ERROR state")
12991299
}
13001300
}
@@ -1324,9 +1324,9 @@ func TestRequirement_1_7_6(t *testing.T) {
13241324
&ProviderEventing{},
13251325
}
13261326

1327-
_ = GetApiInstance().SetProvider(notReadyEventingProvider)
1327+
_ = SetProvider(notReadyEventingProvider)
13281328

1329-
client := GetApiInstance().GetNamedClient("somOtherClient")
1329+
client := NewClient("somOtherClient")
13301330
client.AddHooks(mockHook)
13311331

13321332
if client.State() != NotReadyState {
@@ -1372,7 +1372,7 @@ func TestRequirement_1_7_7(t *testing.T) {
13721372
mockHook.EXPECT().Error(gomock.Any(), gomock.Any(), ProviderFatalError, gomock.Any())
13731373
mockHook.EXPECT().Finally(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any())
13741374

1375-
client := GetApiInstance().GetNamedClient(t.Name())
1375+
client := NewClient(t.Name())
13761376
client.AddHooks(mockHook)
13771377

13781378
if client.State() != FatalState {
@@ -1405,7 +1405,7 @@ func TestRequirement_5_3_5(t *testing.T) {
14051405
t.Cleanup(initSingleton)
14061406

14071407
eventually(t, func() bool {
1408-
return GetApiInstance().GetClient().State() == NotReadyState
1408+
return NewDefaultClient().State() == NotReadyState
14091409
}, time.Second, 100*time.Millisecond, "expected client to report NOT READY state")
14101410

14111411
eventing := &ProviderEventing{
@@ -1425,26 +1425,26 @@ func TestRequirement_5_3_5(t *testing.T) {
14251425
}
14261426

14271427
eventually(t, func() bool {
1428-
return GetApiInstance().GetNamedClient(t.Name()).State() == ReadyState
1428+
return NewClient(t.Name()).State() == ReadyState
14291429
}, time.Second, 100*time.Millisecond, "expected client to report READY state")
14301430

14311431
eventing.Invoke(Event{EventType: ProviderStale})
14321432
eventually(t, func() bool {
1433-
return GetApiInstance().GetNamedClient(t.Name()).State() == StaleState
1433+
return NewClient(t.Name()).State() == StaleState
14341434
}, time.Second, 100*time.Millisecond, "expected client to report STALE state")
14351435

14361436
eventing.Invoke(Event{EventType: ProviderError})
14371437
eventually(t, func() bool {
1438-
return GetApiInstance().GetNamedClient(t.Name()).State() == ErrorState
1438+
return NewClient(t.Name()).State() == ErrorState
14391439
}, time.Second, 100*time.Millisecond, "expected client to report ERROR state")
14401440

14411441
eventing.Invoke(Event{EventType: ProviderReady})
14421442
eventually(t, func() bool {
1443-
return GetApiInstance().GetNamedClient(t.Name()).State() == ReadyState
1443+
return NewClient(t.Name()).State() == ReadyState
14441444
}, time.Second, 100*time.Millisecond, "expected client to report READY state")
14451445

14461446
eventing.Invoke(Event{EventType: ProviderError, ProviderEventDetails: ProviderEventDetails{ErrorCode: ProviderFatalCode}})
14471447
eventually(t, func() bool {
1448-
return GetApiInstance().GetNamedClient(t.Name()).State() == FatalState
1448+
return NewClient(t.Name()).State() == FatalState
14491449
}, time.Second, 100*time.Millisecond, "expected client to report FATAL state")
14501450
}

openfeature/evaluation_context_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ func TestRequirement_3_2_2(t *testing.T) {
118118
t.Errorf("error setting up provider %v", err)
119119
}
120120

121-
client := GetApiInstance().GetNamedClient(t.Name())
121+
client := NewClient(t.Name())
122122
clientEvalCtx := EvaluationContext{
123123
targetingKey: "Client",
124124
attributes: map[string]any{

openfeature/event_executor_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -989,7 +989,7 @@ func TestEventHandler_HandlersRunImmediately(t *testing.T) {
989989

990990
// assert client transitioned to ERROR
991991
eventually(t, func() bool {
992-
return GetApiInstance().GetClient().State() == ErrorState
992+
return NewDefaultClient().State() == ErrorState
993993
}, time.Second, time.Millisecond*100, "")
994994

995995
select {
@@ -1032,7 +1032,7 @@ func TestEventHandler_HandlersRunImmediately(t *testing.T) {
10321032

10331033
// assert client transitioned to STALE
10341034
eventually(t, func() bool {
1035-
return GetApiInstance().GetClient().State() == StaleState
1035+
return NewDefaultClient().State() == StaleState
10361036
}, time.Second, time.Millisecond*100, "")
10371037

10381038
select {

openfeature/hooks/logging_hook_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func testLoggingHookLogsMessagesAsExpected(hook LoggingHook, logger *slog.Logger
8989
t.Error("error setting provider", err)
9090
}
9191
openfeature.AddHooks(&hook)
92-
client := openfeature.GetApiInstance().GetNamedClient("test-app")
92+
client := openfeature.NewClient("test-app")
9393

9494
t.Run("test boolean success", func(t *testing.T) {
9595
res, err := client.BooleanValue(

0 commit comments

Comments
 (0)