Skip to content

Commit

Permalink
Merge pull request #52 from open-feature/feat/remove-evaluation-optio…
Browse files Browse the repository at this point in the history
…ns-from-provider

Removed evaluation options from provider
  • Loading branch information
benjiro authored Aug 25, 2022
2 parents 0355463 + 0594ed7 commit 1a596bf
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 1a596bf

Please sign in to comment.