Skip to content

Commit

Permalink
Merge branch 'main' into initialize-and-shutdown
Browse files Browse the repository at this point in the history
  • Loading branch information
beeme1mr authored Oct 18, 2023
2 parents 68f17d8 + 88a204d commit 862be1d
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 5 deletions.
1 change: 1 addition & 0 deletions openfeature/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,7 @@ def _create_provider_evaluation(
flag_key=flag_key,
value=resolution.value,
variant=resolution.variant,
flag_metadata=resolution.flag_metadata or {},
reason=resolution.reason,
error_code=resolution.error_code,
error_message=resolution.error_message,
Expand Down
5 changes: 4 additions & 1 deletion openfeature/flag_evaluation.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ class Reason(StrEnum):
UNKNOWN = "UNKNOWN"


FlagMetadata = typing.Mapping[str, typing.Any]

T = typing.TypeVar("T", covariant=True)


Expand All @@ -37,6 +39,7 @@ class FlagEvaluationDetails(typing.Generic[T]):
flag_key: str
value: T
variant: typing.Optional[str] = None
flag_metadata: FlagMetadata = field(default_factory=dict)
reason: typing.Optional[Reason] = None
error_code: typing.Optional[ErrorCode] = None
error_message: typing.Optional[str] = None
Expand All @@ -58,4 +61,4 @@ class FlagResolutionDetails(typing.Generic[U]):
error_message: typing.Optional[str] = None
reason: typing.Optional[Reason] = None
variant: typing.Optional[str] = None
flag_metadata: typing.Optional[str] = None
flag_metadata: FlagMetadata = field(default_factory=dict)
6 changes: 4 additions & 2 deletions openfeature/provider/in_memory_provider.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import typing
from dataclasses import dataclass
from dataclasses import dataclass, field

from openfeature._backports.strenum import StrEnum
from openfeature.evaluation_context import EvaluationContext
from openfeature.exception import ErrorCode
from openfeature.flag_evaluation import FlagResolutionDetails, Reason
from openfeature.flag_evaluation import FlagMetadata, FlagResolutionDetails, Reason
from openfeature.hook import Hook
from openfeature.provider.metadata import Metadata
from openfeature.provider.provider import AbstractProvider
Expand All @@ -29,6 +29,7 @@ class State(StrEnum):
flag_key: str
default_variant: str
variants: typing.Dict[str, T]
flag_metadata: FlagMetadata = field(default_factory=dict)
state: State = State.ENABLED
context_evaluator: typing.Optional[
typing.Callable[["InMemoryFlag", EvaluationContext], FlagResolutionDetails[T]]
Expand All @@ -46,6 +47,7 @@ def resolve(
value=self.variants[self.default_variant],
reason=Reason.STATIC,
variant=self.default_variant,
flag_metadata=self.flag_metadata,
)


Expand Down
23 changes: 23 additions & 0 deletions tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from openfeature.exception import ErrorCode, OpenFeatureError
from openfeature.flag_evaluation import Reason
from openfeature.hook import Hook
from openfeature.provider.in_memory_provider import InMemoryFlag, InMemoryProvider
from openfeature.provider.no_op_provider import NoOpProvider


Expand Down Expand Up @@ -97,6 +98,28 @@ def test_should_raise_exception_when_invalid_flag_type_provided(no_op_provider_c
assert flag.reason == Reason.ERROR


def test_should_pass_flag_metadata_from_resolution_to_evaluation_details():
# Given
provider = InMemoryProvider(
{
"Key": InMemoryFlag(
"Key",
"true",
{"true": True, "false": False},
flag_metadata={"foo": "bar"},
)
}
)
client = OpenFeatureClient("my-client", None, provider)

# When
details = client.get_boolean_details(flag_key="Key", default_value=False)

# Then
assert details is not None
assert details.flag_metadata == {"foo": "bar"}


def test_should_handle_a_generic_exception_thrown_by_a_provider(no_op_provider_client):
# Given
exception_hook = MagicMock(spec=Hook)
Expand Down
6 changes: 4 additions & 2 deletions tests/test_flag_evaluation.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@
from openfeature.flag_evaluation import FlagEvaluationDetails, Reason


def test_evaulation_details_reason_should_be_a_string():
def test_evaluation_details_reason_should_be_a_string():
# Given
flag_key = "my-flag"
flag_value = 100
variant = "1-hundred"
flag_metadata = {}
reason = Reason.DEFAULT
error_code = ErrorCode.GENERAL
error_message = "message"
Expand All @@ -16,6 +17,7 @@ def test_evaulation_details_reason_should_be_a_string():
flag_key,
flag_value,
variant,
flag_metadata,
reason,
error_code,
error_message,
Expand All @@ -30,7 +32,7 @@ def test_evaulation_details_reason_should_be_a_string():
assert reason == flag_details.reason


def test_evaulation_details_reason_should_be_a_string_when_set():
def test_evaluation_details_reason_should_be_a_string_when_set():
# Given
flag_key = "my-flag"
flag_value = 100
Expand Down

0 comments on commit 862be1d

Please sign in to comment.