Skip to content

Commit 85db1e0

Browse files
fix: Get Object should return both list and dict (#64)
* Get Object should return both list and dict Signed-off-by: Thomas Poignant <[email protected]>
1 parent 00400fa commit 85db1e0

File tree

6 files changed

+28
-6
lines changed

6 files changed

+28
-6
lines changed
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1+
import typing
12
from enum import Enum
23

34

45
class FlagType(Enum):
56
BOOLEAN = bool
67
STRING = str
7-
OBJECT = dict
8+
OBJECT = typing.Union[dict, list]
89
FLOAT = float
910
INTEGER = int

open_feature/open_feature_client.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,11 @@ def _create_provider_evaluation(
358358

359359
value = get_details_callable(*args)
360360

361-
if not isinstance(value.value, flag_type.value):
361+
# we need to check the get_args to be compatible with union types.
362+
is_right_instance = isinstance(
363+
value.value, typing.get_args(flag_type.value)
364+
) or isinstance(value.value, flag_type.value)
365+
if not is_right_instance:
362366
raise TypeMismatchError()
363367

364368
return value

open_feature/provider/no_op_provider.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,9 @@ def resolve_float_details(
7373
def resolve_object_details(
7474
self,
7575
flag_key: str,
76-
default_value: dict,
76+
default_value: typing.Union[dict, list],
7777
evaluation_context: typing.Optional[EvaluationContext] = None,
78-
) -> FlagEvaluationDetails[dict]:
78+
) -> FlagEvaluationDetails[typing.Union[dict, list]]:
7979
return FlagEvaluationDetails(
8080
flag_key=flag_key,
8181
value=default_value,

open_feature/provider/provider.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def resolve_float_details(
5656
def resolve_object_details(
5757
self,
5858
flag_key: str,
59-
default_value: dict,
59+
default_value: typing.Union[dict, list],
6060
evaluation_context: typing.Optional[EvaluationContext] = None,
61-
) -> FlagEvaluationDetails[dict]:
61+
) -> FlagEvaluationDetails[typing.Union[dict, list]]:
6262
pass

tests/provider/test_no_op_provider.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,18 @@ def test_should_resolve_string_flag_from_no_op():
5353
assert isinstance(flag.value, str)
5454

5555

56+
def test_should_resolve_list_flag_from_no_op():
57+
# Given
58+
# When
59+
flag = NoOpProvider().resolve_object_details(
60+
flag_key="Key", default_value=["item1", "item2"]
61+
)
62+
# Then
63+
assert flag is not None
64+
assert flag.value == ["item1", "item2"]
65+
assert isinstance(flag.value, list)
66+
67+
5668
def test_should_resolve_object_flag_from_no_op():
5769
# Given
5870
return_value = {

tests/test_open_feature_client.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@
2424
},
2525
"get_object_value",
2626
),
27+
(
28+
list,
29+
["string1", "string2"],
30+
"get_object_value",
31+
),
2732
),
2833
)
2934
def test_should_get_flag_value_based_on_method_type(

0 commit comments

Comments
 (0)