Skip to content

Commit 33afbd4

Browse files
authored
FFM-7360 Log error if default variation returned (#58)
* FFM-7360 Implement default error log for returning default variation * FFM-7360 Lint * FFM-7360 Dependabot alert * FFM-7360 Dependabot alert * FFM-7360 Fix testcases * FFM-7360 Linting
1 parent ff3993f commit 33afbd4

File tree

5 files changed

+80
-35
lines changed

5 files changed

+80
-35
lines changed

featureflags/client.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ def bool_variation(self, identifier: str, target: Target,
138138
# an empty identifier.
139139
if self._config.enable_analytics and variation.identifier != "":
140140
self._analytics.enqueue(target, identifier, variation)
141-
return variation.bool(default)
141+
return variation.bool(target, identifier, default)
142142

143143
def int_variation(self, identifier: str, target: Target,
144144
default: int) -> int:
@@ -149,7 +149,7 @@ def int_variation(self, identifier: str, target: Target,
149149
# an empty identifier.
150150
if self._config.enable_analytics and variation.identifier != "":
151151
self._analytics.enqueue(target, identifier, variation)
152-
return variation.int(default)
152+
return variation.int(target, identifier, default)
153153

154154
def number_variation(self, identifier: str, target: Target,
155155
default: float) -> float:
@@ -161,7 +161,7 @@ def number_variation(self, identifier: str, target: Target,
161161
# an empty identifier.
162162
if self._config.enable_analytics and variation.identifier != "":
163163
self._analytics.enqueue(target, identifier, variation)
164-
return variation.number(default)
164+
return variation.number(target, identifier, default)
165165

166166
def string_variation(self, identifier: str, target: Target,
167167
default: str) -> str:
@@ -173,7 +173,7 @@ def string_variation(self, identifier: str, target: Target,
173173
# an empty identifier.
174174
if self._config.enable_analytics and variation.identifier != "":
175175
self._analytics.enqueue(target, identifier, variation)
176-
return variation.string(default)
176+
return variation.string(target, identifier, default)
177177

178178
def json_variation(self, identifier: str, target: Target,
179179
default: Dict[str, Any]) -> Dict[str, Any]:
@@ -184,7 +184,7 @@ def json_variation(self, identifier: str, target: Target,
184184
# an empty identifier.
185185
if self._config.enable_analytics and variation.identifier != "":
186186
self._analytics.enqueue(target, identifier, variation)
187-
return variation.json(default)
187+
return variation.json(target, identifier, default)
188188

189189
def close(self):
190190
log.info('closing sdk client')

featureflags/evaluations/variation.py

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44

55
import attr
66

7+
from featureflags.evaluations.auth_target import Target
78
from featureflags.models import UNSET, Unset
9+
from featureflags.util import log
810

911
T = TypeVar("T", bound="Variation")
1012

@@ -17,27 +19,54 @@ class Variation(object):
1719
description: Union[Unset, str] = UNSET
1820
additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict)
1921

20-
def bool(self, default: bool = False) -> bool:
22+
def bool(self, target: Target, flag_identifier: str,
23+
default: bool = False) -> bool:
2124
if self.value:
2225
return self.value.lower() == "true"
26+
log.error(
27+
"Failed to evaluate bool variation for %s and the "
28+
"default variation '%s' is being returned",
29+
{"target": target.identifier, "flag": flag_identifier}, default)
2330
return default
2431

25-
def string(self, default: str) -> str:
26-
return self.value or default
32+
def string(self, target: Target, flag_identifier: str,
33+
default: str) -> str:
34+
if self.value:
35+
return self.value
36+
log.error(
37+
"Failed to evaluate string variation for %s and the "
38+
"default variation '%s' is being returned",
39+
{"target": target.identifier, "flag": flag_identifier}, default)
40+
return default
2741

28-
def number(self, default: float) -> float:
42+
def number(self, target: Target, flag_identifier: str,
43+
default: float) -> float:
2944
if self.value:
3045
return float(self.value)
46+
log.error(
47+
"Failed to evaluate number variation for %s and the "
48+
"default variation '%s' is being returned",
49+
{"target": target.identifier, "flag": flag_identifier}, default)
3150
return default
3251

33-
def int(self, default: int) -> int:
52+
def int(self, target: Target, flag_identifier: str,
53+
default: int) -> int:
3454
if self.value:
3555
return int(self.value)
56+
log.error(
57+
"Failed to evaluate int variation for %s and the "
58+
"default variation '%s' is being returned",
59+
{"target": target.identifier, "flag": flag_identifier}, default)
3660
return default
3761

38-
def json(self, default: dict) -> dict:
62+
def json(self, target: Target, flag_identifier: str,
63+
default: dict) -> dict:
3964
if self.value:
4065
return json.loads(self.value)
66+
log.error(
67+
"Failed to evaluate json variation for %s and the "
68+
"default variation '%s' is being returned",
69+
{"target": target.identifier, "flag": flag_identifier}, default)
4170
return default
4271

4372
def to_dict(self) -> Dict[str, Any]:

requirements_dev.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ twine==3.4.1
1414
pytest==5.1
1515
pytest-runner==5.1
1616
pytest-mock==3.6.1
17-
setuptools~=54.2.0
18-
httpx~=0.16.1
17+
setuptools~=65.5.1
18+
httpx~=0.23.0
1919
attrs~=21.2.0
2020

2121
pyjwt==2.4.0

tests/integration/test_evaluator.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,14 +128,18 @@ def test_evaluator(tc: TestCase):
128128

129129
switch_kind = {
130130
FeatureConfigKind.BOOLEAN:
131-
lambda: evaluator.evaluate(tc.flag, target).bool(default=False),
131+
lambda: evaluator.evaluate(tc.flag, target)
132+
.bool(target, tc.flag, default=False),
132133
FeatureConfigKind.STRING:
133134
lambda: evaluator.evaluate(tc.flag, target).string(
135+
target, tc.flag,
134136
default="failed"),
135137
FeatureConfigKind.INT:
136-
lambda: evaluator.evaluate(tc.flag, target).number(default=0.100),
138+
lambda: evaluator.evaluate(tc.flag, target)
139+
.number(target, tc.flag, default=0.100),
137140
FeatureConfigKind.JSON:
138-
lambda: evaluator.evaluate(tc.flag, target).json(default={}),
141+
lambda: evaluator.evaluate(tc.flag, target)
142+
.json(target, tc.flag, default={}),
139143
}
140144

141145
kind = repository.get_flag(tc.flag).kind

tests/unit/test_variation.py

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,61 +2,73 @@
22

33
import pytest
44

5+
from featureflags.evaluations.auth_target import Target
56
from featureflags.evaluations.variation import Variation
67

78

89
@pytest.mark.parametrize(
9-
"test_input,default,expected",
10+
"test_input, target, flag_identifier, default,expected",
1011
[
11-
("true", False, True),
12-
("false", False, False),
13-
("", False, False),
12+
("true", Target(identifier='harness'), "flag1", False, True),
13+
("false", Target(identifier='harness'), "flag1", False, False),
14+
("", Target(identifier='harness'), "flag1", False, False),
1415
],
1516
)
16-
def test_variation_bool(test_input, default, expected):
17+
def test_variation_bool(test_input, target, flag_identifier,
18+
default, expected):
1719
variation = Variation(identifier="test", value=test_input)
1820

19-
got = variation.bool(default=default)
21+
got = variation.bool(target, flag_identifier, default=default)
2022

2123
assert got == expected
2224

2325

2426
@pytest.mark.parametrize(
25-
"test_input,default,expected",
27+
"test_input, target, flag_identifier, default,expected",
2628
[
27-
("test", "test_default", "test"),
28-
(None, "test_default", "test_default"),
29+
("test", Target(identifier='harness'), "flag1", "test_default",
30+
"test"),
31+
(None, Target(identifier='harness'), "flag1", "test_default",
32+
"test_default"),
2933
],
3034
)
31-
def test_variation_string(test_input, default, expected):
35+
def test_variation_string(test_input, target, flag_identifier,
36+
default, expected):
3237
variation = Variation(identifier="test", value=test_input)
3338

34-
got = variation.string(default=default)
39+
got = variation.string(target, flag_identifier, default=default)
3540

3641
assert got == expected
3742

3843

3944
@pytest.mark.parametrize(
40-
"test_input,default,expected", [(1.1, 1.0, 1.1), (None, 1.0, 1.0)]
45+
"test_input,target,flag_identifier,default,expected", [
46+
(1.1, Target(identifier='harness'), "flag1", 1.0, 1.1),
47+
(None, Target(identifier='harness'), "flag1", 1.0, 1.0)
48+
]
4149
)
42-
def test_variation_number(test_input, default, expected):
50+
def test_variation_number(test_input, target, flag_identifier,
51+
default, expected):
4352
variation = Variation(identifier="test", value=test_input)
4453

45-
got = variation.number(default=default)
54+
got = variation.number(target, flag_identifier, default=default)
4655

4756
assert got == expected
4857

4958

5059
@pytest.mark.parametrize(
51-
"test_input,expected",
60+
"test_input,target,flag_identifier,expected",
5261
[
53-
(json.dumps({"field": "value"}), json.dumps({"field": "value"})),
54-
(None, json.dumps({"field": "value2"})),
62+
(json.dumps({"field": "value"}), Target(identifier='harness'),
63+
"flag1", json.dumps({"field": "value"})),
64+
(None, Target(identifier='harness'), "flag1",
65+
json.dumps({"field": "value2"})),
5566
],
5667
)
57-
def test_variation_json(test_input, expected):
68+
def test_variation_json(test_input, target,
69+
flag_identifier, expected):
5870
variation = Variation(identifier="test", value=test_input)
5971

60-
got = variation.json(default={"field": "value2"})
72+
got = variation.json(target, flag_identifier, default={"field": "value2"})
6173

6274
assert got == json.loads(expected)

0 commit comments

Comments
 (0)