Skip to content

Commit a21081d

Browse files
author
Ran Isenberg
committed
rename default value
1 parent da9c270 commit a21081d

File tree

2 files changed

+48
-48
lines changed

2 files changed

+48
-48
lines changed

aws_lambda_powertools/utilities/feature_toggles/configuration_store.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
TRANSFORM_TYPE = "json"
1313
FEATURES_KEY = "features"
1414
RULES_KEY = "rules"
15-
DEFAULT_VAL_KEY = "default_value"
15+
DEFAULT_VAL_KEY = "feature_default_value"
1616
RESTRICTIONS_KEY = "restrictions"
1717
RULE_NAME_KEY = "name"
18-
RULE_DEFAULT_VALUE = "default_value"
18+
RULE_DEFAULT_VALUE = "rule_default_value"
1919
RESTRICTION_KEY = "key"
2020
RESTRICTION_VALUE = "value"
2121
RESTRICTION_ACTION = "action"
@@ -73,7 +73,7 @@ def _handle_rules(
7373
*,
7474
feature_name: str,
7575
rules_context: Dict[str, Any],
76-
default_value: bool,
76+
feature_default_value: bool,
7777
rules: List[Dict[str, Any]],
7878
) -> bool:
7979
for rule in rules:
@@ -88,21 +88,21 @@ def _handle_rules(
8888
restriction.get(RESTRICTION_ACTION), restriction.get(RESTRICTION_VALUE), context_value
8989
):
9090
logger.debug(
91-
f"rule did not match action, rule_name={rule_name}, default_value={rule_default_value}, feature_name={feature_name}, context_value={str(context_value)}" # noqa: E501
91+
f"rule did not match action, rule_name={rule_name}, rule_default_value={rule_default_value}, feature_name={feature_name}, context_value={str(context_value)}" # noqa: E501
9292
)
9393
is_match = False # rules doesn't match restriction
9494
break
9595
# if we got here, all restrictions match
9696
if is_match:
9797
logger.debug(
98-
f"rule matched, rule_name={rule_name}, default_value={rule_default_value}, feature_name={feature_name}" # noqa: E501
98+
f"rule matched, rule_name={rule_name}, rule_default_value={rule_default_value}, feature_name={feature_name}" # noqa: E501
9999
)
100100
return rule_default_value
101101
# no rule matched, return default value of feature
102102
logger.debug(
103-
f"no rule matched, returning default value of feature, default_value={default_value}, feature_name={feature_name}" # noqa: E501
103+
f"no rule matched, returning default value of feature, feature_default_value={feature_default_value}, feature_name={feature_name}" # noqa: E501
104104
)
105-
return default_value
105+
return feature_default_value
106106

107107
def get_configuration(self) -> Dict[str, Any]:
108108
"""Get configuration string from AWs AppConfig and returned the parsed JSON dictionary
@@ -130,24 +130,24 @@ def get_configuration(self) -> Dict[str, Any]:
130130
raise ConfigurationException(error_str)
131131
return schema
132132

133-
def get_feature_toggle(self, *, feature_name: str, rules_context: Dict[str, Any], default_value: bool) -> bool:
133+
def get_feature_toggle(self, *, feature_name: str, rules_context: Dict[str, Any], value_if_missing: bool) -> bool:
134134
"""get a feature toggle boolean value. Value is calculated according to a set of rules and conditions.
135135
see below for explanation.
136136
137137
Args:
138138
feature_name (str): feature name that you wish to fetch
139139
rules_context (Dict[str, Any]): dict of attributes that you would like to match the rules
140140
against, can be {'tenant_id: 'X', 'username':' 'Y', 'region': 'Z'} etc.
141-
default_value (bool): this will be the returned value in case the feature toggle doesn't exist in the schema
141+
value_if_missing (bool): this will be the returned value in case the feature toggle doesn't exist in the schema
142142
or there has been an error while fetching the configuration from appconfig
143143
144144
Returns:
145145
bool: calculated feature toggle value. several possibilities:
146146
1. if the feature doesn't appear in the schema or there has been an error fetching the
147-
configuration -> error log would appear and default_value is returned
148-
2. feature exists and has no rules or no rules have matched -> return default_value of
147+
configuration -> warning log would appear and value_if_missing is returned
148+
2. feature exists and has no rules or no rules have matched -> return feature_default_value of
149149
the defined feature
150-
3. feature exists and a rule matches -> default_value of rule is returned
150+
3. feature exists and a rule matches -> rule_default_value of rule is returned
151151
"""
152152
try:
153153
toggles_dict: Dict[str, Any] = self.get_configuration()
@@ -158,22 +158,22 @@ def get_feature_toggle(self, *, feature_name: str, rules_context: Dict[str, Any]
158158
feature: Dict[str, Dict] = toggles_dict.get(FEATURES_KEY, {}).get(feature_name, None)
159159
if feature is None:
160160
logger.warning(
161-
f"feature does not appear in configuration, using provided default value, feature_name={feature_name}, default_value={default_value}" # noqa: E501
161+
f"feature does not appear in configuration, using provided default value, feature_name={feature_name}, value_if_missing={value_if_missing}" # noqa: E501
162162
)
163-
return default_value
163+
return value_if_missing
164164

165165
rules_list = feature.get(RULES_KEY, [])
166-
default_value = feature.get(DEFAULT_VAL_KEY)
166+
feature_default_value = feature.get(DEFAULT_VAL_KEY)
167167
if not rules_list:
168168
# not rules but has a value
169169
logger.debug(
170-
f"no rules found, returning feature default value, feature_name={feature_name}, default_value={default_value}" # noqa: E501
170+
f"no rules found, returning feature default value, feature_name={feature_name}, default_value={feature_default_value}" # noqa: E501
171171
)
172-
return default_value
172+
return feature_default_value
173173
# look for first rule match
174174
logger.debug(
175-
f"looking for rule match, feature_name={feature_name}, default_value={default_value}"
175+
f"looking for rule match, feature_name={feature_name}, feature_default_value={feature_default_value}"
176176
) # noqa: E501
177177
return self._handle_rules(
178-
feature_name=feature_name, rules_context=rules_context, default_value=default_value, rules=rules_list
178+
feature_name=feature_name, rules_context=rules_context, feature_default_value=feature_default_value, rules=rules_list
179179
)

tests/functional/feature_toggles/test_feature_toggles.py

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ def test_toggles_rule_does_not_match(mocker, config):
3232
"log_level": "DEBUG",
3333
"features": {
3434
"my_feature": {
35-
"default_value": expected_value,
35+
"feature_default_value": expected_value,
3636
"rules": [
3737
{
3838
"name": "tenant id equals 345345435",
39-
"default_value": "False",
39+
"rule_default_value": "False",
4040
"restrictions": [
4141
{
4242
"action": ACTION.EQUALS.value,
@@ -51,29 +51,29 @@ def test_toggles_rule_does_not_match(mocker, config):
5151
}
5252

5353
conf_store = init_configuration_store(mocker, mocked_app_config_schema, config)
54-
toggle = conf_store.get_feature_toggle(feature_name="my_feature", rules_context={}, default_value=False)
54+
toggle = conf_store.get_feature_toggle(feature_name="my_feature", rules_context={}, value_if_missing=False)
5555
assert str(toggle) == expected_value
5656

5757

5858
# this test checks that if you try to get a feature that doesn't exist in the schema,
5959
# you get the default value of False that was sent to the get_feature_toggle API
6060
def test_toggles_no_restrictions_feature_does_not_exist(mocker, config):
6161
expected_value = False
62-
mocked_app_config_schema = {"log_level": "DEBUG", "features": {"my_fake_feature": {"default_value": "True"}}}
62+
mocked_app_config_schema = {"log_level": "DEBUG", "features": {"my_fake_feature": {"feature_default_value": "True"}}}
6363

6464
conf_store = init_configuration_store(mocker, mocked_app_config_schema, config)
65-
toggle = conf_store.get_feature_toggle(feature_name="my_feature", rules_context={}, default_value=expected_value)
65+
toggle = conf_store.get_feature_toggle(feature_name="my_feature", rules_context={}, value_if_missing=expected_value)
6666
assert toggle == expected_value
6767

6868

6969
# check that feature match works when they are no rules and we send rules_context.
7070
# default value is False but the feature has a True default_value.
7171
def test_toggles_no_rules(mocker, config):
7272
expected_value = "True"
73-
mocked_app_config_schema = {"log_level": "DEBUG", "features": {"my_feature": {"default_value": expected_value}}}
73+
mocked_app_config_schema = {"log_level": "DEBUG", "features": {"my_feature": {"feature_default_value": expected_value}}}
7474
conf_store = init_configuration_store(mocker, mocked_app_config_schema, config)
7575
toggle = conf_store.get_feature_toggle(
76-
feature_name="my_feature", rules_context={"tenant_id": "6", "username": "a"}, default_value=False
76+
feature_name="my_feature", rules_context={"tenant_id": "6", "username": "a"}, value_if_missing=False
7777
)
7878
assert str(toggle) == expected_value
7979

@@ -85,11 +85,11 @@ def test_toggles_restrictions_no_match(mocker, config):
8585
"log_level": "DEBUG",
8686
"features": {
8787
"my_feature": {
88-
"default_value": expected_value,
88+
"feature_default_value": expected_value,
8989
"rules": [
9090
{
9191
"name": "tenant id equals 345345435",
92-
"default_value": "False",
92+
"rule_default_value": "False",
9393
"restrictions": [
9494
{
9595
"action": ACTION.EQUALS.value,
@@ -106,7 +106,7 @@ def test_toggles_restrictions_no_match(mocker, config):
106106
toggle = conf_store.get_feature_toggle(
107107
feature_name="my_feature",
108108
rules_context={"tenant_id": "6", "username": "a"}, # rule will not match
109-
default_value=False,
109+
value_if_missing=False,
110110
)
111111
assert str(toggle) == expected_value
112112

@@ -120,11 +120,11 @@ def test_toggles_restrictions_rule_match_equal_multiple_restrictions(mocker, con
120120
"log_level": "DEBUG",
121121
"features": {
122122
"my_feature": {
123-
"default_value": "True",
123+
"feature_default_value": "True",
124124
"rules": [
125125
{
126126
"name": "tenant id equals 6 and username is a",
127-
"default_value": expected_value,
127+
"rule_default_value": expected_value,
128128
"restrictions": [
129129
{
130130
"action": ACTION.EQUALS.value, # this rule will match, it has multiple restrictions
@@ -149,7 +149,7 @@ def test_toggles_restrictions_rule_match_equal_multiple_restrictions(mocker, con
149149
"tenant_id": tenant_id_val,
150150
"username": username_val,
151151
},
152-
default_value=True,
152+
value_if_missing=True,
153153
)
154154
assert str(toggle) == expected_value
155155

@@ -163,11 +163,11 @@ def test_toggles_restrictions_no_rule_match_equal_multiple_restrictions(mocker,
163163
"log_level": "DEBUG",
164164
"features": {
165165
"my_feature": {
166-
"default_value": expected_val,
166+
"feature_default_value": expected_val,
167167
"rules": [
168168
{
169169
"name": "tenant id equals 645654 and username is a", # rule will not match
170-
"default_value": "False",
170+
"rule_default_value": "False",
171171
"restrictions": [
172172
{
173173
"action": ACTION.EQUALS.value,
@@ -187,7 +187,7 @@ def test_toggles_restrictions_no_rule_match_equal_multiple_restrictions(mocker,
187187
}
188188
conf_store = init_configuration_store(mocker, mocked_app_config_schema, config)
189189
toggle = conf_store.get_feature_toggle(
190-
feature_name="my_feature", rules_context={"tenant_id": "6", "username": "a"}, default_value=False
190+
feature_name="my_feature", rules_context={"tenant_id": "6", "username": "a"}, value_if_missing=False
191191
)
192192
assert str(toggle) == expected_val
193193

@@ -202,11 +202,11 @@ def test_toggles_restrictions_rule_match_multiple_actions_multiple_rules_multipl
202202
"log_level": "DEBUG",
203203
"features": {
204204
"my_feature": {
205-
"default_value": expected_value_third_check,
205+
"feature_default_value": expected_value_third_check,
206206
"rules": [
207207
{
208208
"name": "tenant id equals 6 and username startswith a",
209-
"default_value": expected_value_first_check,
209+
"rule_default_value": expected_value_first_check,
210210
"restrictions": [
211211
{
212212
"action": ACTION.EQUALS.value,
@@ -222,7 +222,7 @@ def test_toggles_restrictions_rule_match_multiple_actions_multiple_rules_multipl
222222
},
223223
{
224224
"name": "tenant id equals 4446 and username startswith a and endswith z",
225-
"default_value": expected_value_second_check,
225+
"rule_default_value": expected_value_second_check,
226226
"restrictions": [
227227
{
228228
"action": ACTION.EQUALS.value,
@@ -251,28 +251,28 @@ def test_toggles_restrictions_rule_match_multiple_actions_multiple_rules_multipl
251251
toggle = conf_store.get_feature_toggle(
252252
feature_name="my_feature",
253253
rules_context={"tenant_id": "6", "username": "abcd"},
254-
default_value=False,
254+
value_if_missing=False,
255255
)
256256
assert str(toggle) == expected_value_first_check
257257
# match second rule
258258
toggle = conf_store.get_feature_toggle(
259259
feature_name="my_feature",
260260
rules_context={"tenant_id": "4446", "username": "az"},
261-
default_value=False,
261+
value_if_missing=False,
262262
)
263263
assert str(toggle) == expected_value_second_check
264264
# match no rule
265265
toggle = conf_store.get_feature_toggle(
266266
feature_name="my_feature",
267267
rules_context={"tenant_id": "11114446", "username": "ab"},
268-
default_value=False,
268+
value_if_missing=False,
269269
)
270270
assert str(toggle) == expected_value_third_check
271271
# feature doesn't exist
272272
toggle = conf_store.get_feature_toggle(
273273
feature_name="my_fake_feature",
274274
rules_context={"tenant_id": "11114446", "username": "ab"},
275-
default_value=expected_value_fourth_case,
275+
value_if_missing=expected_value_fourth_case,
276276
)
277277
assert toggle == expected_value_fourth_case
278278

@@ -284,11 +284,11 @@ def test_toggles_match_rule_with_contains_action(mocker, config):
284284
"log_level": "DEBUG",
285285
"features": {
286286
"my_feature": {
287-
"default_value": expected_value,
287+
"feature_default_value": expected_value,
288288
"rules": [
289289
{
290290
"name": "tenant id equals 345345435",
291-
"default_value": True,
291+
"rule_default_value": True,
292292
"restrictions": [
293293
{
294294
"action": ACTION.CONTAINS.value,
@@ -305,7 +305,7 @@ def test_toggles_match_rule_with_contains_action(mocker, config):
305305
toggle = conf_store.get_feature_toggle(
306306
feature_name="my_feature",
307307
rules_context={"tenant_id": "6", "username": "a"}, # rule will match
308-
default_value=False,
308+
value_if_missing=False,
309309
)
310310
assert toggle == expected_value
311311

@@ -316,11 +316,11 @@ def test_toggles_no_match_rule_with_contains_action(mocker, config):
316316
"log_level": "DEBUG",
317317
"features": {
318318
"my_feature": {
319-
"default_value": expected_value,
319+
"feature_default_value": expected_value,
320320
"rules": [
321321
{
322322
"name": "tenant id equals 345345435",
323-
"default_value": True,
323+
"rule_default_value": True,
324324
"restrictions": [
325325
{
326326
"action": ACTION.CONTAINS.value,
@@ -337,6 +337,6 @@ def test_toggles_no_match_rule_with_contains_action(mocker, config):
337337
toggle = conf_store.get_feature_toggle(
338338
feature_name="my_feature",
339339
rules_context={"tenant_id": "6", "username": "a"}, # rule will not match
340-
default_value=False,
340+
value_if_missing=False,
341341
)
342342
assert toggle == expected_value

0 commit comments

Comments
 (0)