Skip to content

Commit

Permalink
Removed evaluation options from provider
Browse files Browse the repository at this point in the history
As per spec 0.4 remove flag evaluation option from the provider

- Update FeatureProvider
- Update doco

Signed-off-by: Benjamin Evenson <2031163+benjiro@users.noreply.github.com>
  • Loading branch information
benjiro committed Aug 25, 2022
1 parent 0355463 commit 0594ed7
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 77 deletions.
15 changes: 5 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,36 +53,31 @@ public class MyFeatureProvider : FeatureProvider
}

public Task<ResolutionDetails<bool>> ResolveBooleanValue(string flagKey, bool defaultValue,
EvaluationContext context = null,
FlagEvaluationOptions config = null)
EvaluationContext context = null)
{
// code to resolve boolean details
}

public Task<ResolutionDetails<string>> ResolveStringValue(string flagKey, string defaultValue,
EvaluationContext context = null,
FlagEvaluationOptions config = null)
EvaluationContext context = null)
{
// code to resolve string details
}

public Task<ResolutionDetails<int>> ResolveIntegerValue(string flagKey, int defaultValue,
EvaluationContext context = null,
FlagEvaluationOptions config = null)
EvaluationContext context = null)
{
// code to resolve integer details
}

public Task<ResolutionDetails<double>> ResolveDoubleValue(string flagKey, double defaultValue,
EvaluationContext context = null,
FlagEvaluationOptions config = null)
EvaluationContext context = null)
{
// code to resolve integer details
}

public Task<ResolutionDetails<T>> ResolveStructureValue<T>(string flagKey, T defaultValue,
EvaluationContext context = null,
FlagEvaluationOptions config = null)
EvaluationContext context = null)
{
// code to resolve object details
}
Expand Down
15 changes: 5 additions & 10 deletions src/OpenFeature.SDK/FeatureProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,54 +37,49 @@ public abstract class FeatureProvider
/// <param name="flagKey">Feature flag key</param>
/// <param name="defaultValue">Default value</param>
/// <param name="context"><see cref="EvaluationContext"/></param>
/// <param name="config"><see cref="FlagEvaluationOptions"/></param>
/// <returns><see cref="ResolutionDetails{T}"/></returns>
public abstract Task<ResolutionDetails<bool>> ResolveBooleanValue(string flagKey, bool defaultValue,
EvaluationContext context = null, FlagEvaluationOptions config = null);
EvaluationContext context = null);

/// <summary>
/// Resolves a string feature flag
/// </summary>
/// <param name="flagKey">Feature flag key</param>
/// <param name="defaultValue">Default value</param>
/// <param name="context"><see cref="EvaluationContext"/></param>
/// <param name="config"><see cref="FlagEvaluationOptions"/></param>
/// <returns><see cref="ResolutionDetails{T}"/></returns>
public abstract Task<ResolutionDetails<string>> ResolveStringValue(string flagKey, string defaultValue,
EvaluationContext context = null, FlagEvaluationOptions config = null);
EvaluationContext context = null);

/// <summary>
/// Resolves a integer feature flag
/// </summary>
/// <param name="flagKey">Feature flag key</param>
/// <param name="defaultValue">Default value</param>
/// <param name="context"><see cref="EvaluationContext"/></param>
/// <param name="config"><see cref="FlagEvaluationOptions"/></param>
/// <returns><see cref="ResolutionDetails{T}"/></returns>
public abstract Task<ResolutionDetails<int>> ResolveIntegerValue(string flagKey, int defaultValue,
EvaluationContext context = null, FlagEvaluationOptions config = null);
EvaluationContext context = null);

/// <summary>
/// Resolves a double feature flag
/// </summary>
/// <param name="flagKey">Feature flag key</param>
/// <param name="defaultValue">Default value</param>
/// <param name="context"><see cref="EvaluationContext"/></param>
/// <param name="config"><see cref="FlagEvaluationOptions"/></param>
/// <returns><see cref="ResolutionDetails{T}"/></returns>
public abstract Task<ResolutionDetails<double>> ResolveDoubleValue(string flagKey, double defaultValue,
EvaluationContext context = null, FlagEvaluationOptions config = null);
EvaluationContext context = null);

/// <summary>
/// Resolves a structured feature flag
/// </summary>
/// <param name="flagKey">Feature flag key</param>
/// <param name="defaultValue">Default value</param>
/// <param name="context"><see cref="EvaluationContext"/></param>
/// <param name="config"><see cref="FlagEvaluationOptions"/></param>
/// <typeparam name="T">Type of object</typeparam>
/// <returns><see cref="ResolutionDetails{T}"/></returns>
public abstract Task<ResolutionDetails<T>> ResolveStructureValue<T>(string flagKey, T defaultValue,
EvaluationContext context = null, FlagEvaluationOptions config = null);
EvaluationContext context = null);
}
}
11 changes: 5 additions & 6 deletions src/OpenFeature.SDK/NoOpProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,28 +13,27 @@ public override Metadata GetMetadata()
return this._metadata;
}

public override Task<ResolutionDetails<bool>> ResolveBooleanValue(string flagKey, bool defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null)
public override Task<ResolutionDetails<bool>> ResolveBooleanValue(string flagKey, bool defaultValue, EvaluationContext context = null)
{
return Task.FromResult(NoOpResponse(flagKey, defaultValue));
}

public override Task<ResolutionDetails<string>> ResolveStringValue(string flagKey, string defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null)
public override Task<ResolutionDetails<string>> ResolveStringValue(string flagKey, string defaultValue, EvaluationContext context = null)
{
return Task.FromResult(NoOpResponse(flagKey, defaultValue));
}

public override Task<ResolutionDetails<int>> ResolveIntegerValue(string flagKey, int defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null)
public override Task<ResolutionDetails<int>> ResolveIntegerValue(string flagKey, int defaultValue, EvaluationContext context = null)
{
return Task.FromResult(NoOpResponse(flagKey, defaultValue));
}

public override Task<ResolutionDetails<double>> ResolveDoubleValue(string flagKey, double defaultValue, EvaluationContext context = null,
FlagEvaluationOptions config = null)
public override Task<ResolutionDetails<double>> ResolveDoubleValue(string flagKey, double defaultValue, EvaluationContext context = null)
{
return Task.FromResult(NoOpResponse(flagKey, defaultValue));
}

public override Task<ResolutionDetails<T>> ResolveStructureValue<T>(string flagKey, T defaultValue, EvaluationContext context = null, FlagEvaluationOptions config = null)
public override Task<ResolutionDetails<T>> ResolveStructureValue<T>(string flagKey, T defaultValue, EvaluationContext context = null)
{
return Task.FromResult(NoOpResponse(flagKey, defaultValue));
}
Expand Down
4 changes: 2 additions & 2 deletions src/OpenFeature.SDK/OpenFeatureClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ await this.EvaluateFlag(this._featureProvider.ResolveStructureValue, FlagValueTy
defaultValue, context, config);

private async Task<FlagEvaluationDetails<T>> EvaluateFlag<T>(
Func<string, T, EvaluationContext, FlagEvaluationOptions, Task<ResolutionDetails<T>>> resolveValueDelegate,
Func<string, T, EvaluationContext, Task<ResolutionDetails<T>>> resolveValueDelegate,
FlagValueType flagValueType, string flagKey, T defaultValue, EvaluationContext context = null,
FlagEvaluationOptions options = null)
{
Expand Down Expand Up @@ -244,7 +244,7 @@ private async Task<FlagEvaluationDetails<T>> EvaluateFlag<T>(
await this.TriggerBeforeHooks(allHooks, hookContext, options);

evaluation =
(await resolveValueDelegate.Invoke(flagKey, defaultValue, hookContext.EvaluationContext, options))
(await resolveValueDelegate.Invoke(flagKey, defaultValue, hookContext.EvaluationContext))
.ToFlagEvaluationDetails();

await this.TriggerAfterHooks(allHooksReversed, hookContext, evaluation, options);
Expand Down
14 changes: 7 additions & 7 deletions test/OpenFeature.SDK.Tests/FeatureProviderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public void Provider_Must_Have_Metadata()
}

[Fact]
[Specification("2.2", "The `feature provider` interface MUST define methods to resolve flag values, with parameters `flag key` (string, required), `default value` (boolean | number | string | structure, required), `evaluation context` (optional), and `evaluation options` (optional), which returns a `flag resolution` structure.")]
[Specification("2.2", "The `feature provider` interface MUST define methods to resolve flag values, with parameters `flag key` (string, required), `default value` (boolean | number | string | structure, required) and `evaluation context` (optional), which returns a `flag resolution` structure.")]
[Specification("2.3.1", "The `feature provider` interface MUST define methods for typed flag resolution, including boolean, numeric, string, and structure.")]
[Specification("2.4", "In cases of normal execution, the `provider` MUST populate the `flag resolution` structure's `value` field with the resolved flag value.")]
[Specification("2.5", "In cases of normal execution, the `provider` SHOULD populate the `flag resolution` structure's `variant` field with a string identifier corresponding to the returned flag value.")]
Expand Down Expand Up @@ -69,22 +69,22 @@ public async Task Provider_Must_ErrorType()
var defaultStructureValue = fixture.Create<TestStructure>();
var providerMock = new Mock<FeatureProvider>(MockBehavior.Strict);

providerMock.Setup(x => x.ResolveBooleanValue(flagName, defaultBoolValue, It.IsAny<EvaluationContext>(), It.IsAny<FlagEvaluationOptions>()))
providerMock.Setup(x => x.ResolveBooleanValue(flagName, defaultBoolValue, It.IsAny<EvaluationContext>()))
.ReturnsAsync(new ResolutionDetails<bool>(flagName, defaultBoolValue, ErrorType.General, NoOpProvider.ReasonNoOp, NoOpProvider.Variant));

providerMock.Setup(x => x.ResolveIntegerValue(flagName, defaultIntegerValue, It.IsAny<EvaluationContext>(), It.IsAny<FlagEvaluationOptions>()))
providerMock.Setup(x => x.ResolveIntegerValue(flagName, defaultIntegerValue, It.IsAny<EvaluationContext>()))
.ReturnsAsync(new ResolutionDetails<int>(flagName, defaultIntegerValue, ErrorType.ParseError, NoOpProvider.ReasonNoOp, NoOpProvider.Variant));

providerMock.Setup(x => x.ResolveDoubleValue(flagName, defaultDoubleValue, It.IsAny<EvaluationContext>(), It.IsAny<FlagEvaluationOptions>()))
providerMock.Setup(x => x.ResolveDoubleValue(flagName, defaultDoubleValue, It.IsAny<EvaluationContext>()))
.ReturnsAsync(new ResolutionDetails<double>(flagName, defaultDoubleValue, ErrorType.ParseError, NoOpProvider.ReasonNoOp, NoOpProvider.Variant));

providerMock.Setup(x => x.ResolveStringValue(flagName, defaultStringValue, It.IsAny<EvaluationContext>(), It.IsAny<FlagEvaluationOptions>()))
providerMock.Setup(x => x.ResolveStringValue(flagName, defaultStringValue, It.IsAny<EvaluationContext>()))
.ReturnsAsync(new ResolutionDetails<string>(flagName, defaultStringValue, ErrorType.TypeMismatch, NoOpProvider.ReasonNoOp, NoOpProvider.Variant));

providerMock.Setup(x => x.ResolveStructureValue(flagName, defaultStructureValue, It.IsAny<EvaluationContext>(), It.IsAny<FlagEvaluationOptions>()))
providerMock.Setup(x => x.ResolveStructureValue(flagName, defaultStructureValue, It.IsAny<EvaluationContext>()))
.ReturnsAsync(new ResolutionDetails<TestStructure>(flagName, defaultStructureValue, ErrorType.FlagNotFound, NoOpProvider.ReasonNoOp, NoOpProvider.Variant));

providerMock.Setup(x => x.ResolveStructureValue(flagName2, defaultStructureValue, It.IsAny<EvaluationContext>(), It.IsAny<FlagEvaluationOptions>()))
providerMock.Setup(x => x.ResolveStructureValue(flagName2, defaultStructureValue, It.IsAny<EvaluationContext>()))
.ReturnsAsync(new ResolutionDetails<TestStructure>(flagName, defaultStructureValue, ErrorType.ProviderNotReady, NoOpProvider.ReasonNoOp, NoOpProvider.Variant));

var provider = providerMock.Object;
Expand Down
Loading

0 comments on commit 0594ed7

Please sign in to comment.