Skip to content

Commit 6ed29ea

Browse files
authored
Merge pull request #36 from gyft/docs/dynamic-feature-toggles-patch
2 parents d22226f + dd2c1f8 commit 6ed29ea

File tree

4 files changed

+28
-18
lines changed

4 files changed

+28
-18
lines changed

aws_lambda_powertools/utilities/feature_flags/feature_flags.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def _is_rule_matched(self, feature_name: str, rule: Dict[str, Any], context: Dic
5757
return False
5858
# if we got here, all conditions match
5959
logger.debug(
60-
f"rule matched, rule_name={rule_name}, rule_default_value={rule_default_value}, " f"name={feature_name}"
60+
f"rule matched, rule_name={rule_name}, rule_default_value={rule_default_value}, name={feature_name}"
6161
)
6262
return True
6363
return False
@@ -160,7 +160,7 @@ def evaluate(self, *, name: str, context: Optional[Dict[str, Any]] = None, defau
160160
feature = features.get(name)
161161
if feature is None:
162162
logger.debug(
163-
f"feature does not appear in configuration, using provided default, " f"name={name}, default={default}"
163+
f"feature does not appear in configuration, using provided default, name={name}, default={default}"
164164
)
165165
return default
166166

aws_lambda_powertools/utilities/feature_flags/schema.py

+5-8
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,9 @@ def validate(self) -> None:
3838

3939

4040
class FeaturesValidator(BaseValidator):
41-
def __init__(self, schema):
41+
def __init__(self, schema: Dict):
4242
self.schema = schema
43-
self.features: Optional[Dict[str, Dict]] = None
44-
45-
if isinstance(self.schema, dict):
46-
self.features = self.schema.get(FEATURES_KEY)
43+
self.features: Optional[Dict[str, Dict]] = self.schema.get(FEATURES_KEY)
4744

4845
def validate(self):
4946
if not isinstance(self.features, dict):
@@ -71,13 +68,13 @@ def __init__(self, feature: Dict[str, Any], feature_name: str):
7168
self.rules: Optional[List[Dict]] = self.feature.get(RULES_KEY)
7269

7370
def validate(self):
74-
if not isinstance(self.rules, list):
75-
raise ConfigurationError(f"Feature rules is not a list, feature_name={self.feature_name}")
76-
7771
if not self.rules:
7872
logger.debug("Rules are empty, ignoring validation")
7973
return
8074

75+
if not isinstance(self.rules, list):
76+
raise ConfigurationError(f"Feature rules is not a list, feature_name={self.feature_name}")
77+
8178
for rule in self.rules:
8279
self.validate_rule(rule, self.feature)
8380
conditions = ConditionsValidator(rule=rule, rule_name=rule.get(RULE_NAME_KEY))

tests/functional/feature_toggles/test_feature_toggles.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ def test_toggles_match_rule_with_contains_action(mocker, config):
279279
"feature_default_value": False,
280280
"rules": [
281281
{
282-
"rule_name": "tenant id is contained in [6,2] ",
282+
"rule_name": "tenant id is contained in [6, 2]",
283283
"value_when_applies": expected_value,
284284
"conditions": [
285285
{
@@ -306,7 +306,7 @@ def test_toggles_no_match_rule_with_contains_action(mocker, config):
306306
"feature_default_value": expected_value,
307307
"rules": [
308308
{
309-
"rule_name": "tenant id is contained in [6,2] ",
309+
"rule_name": "tenant id is contained in [8, 2]",
310310
"value_when_applies": True,
311311
"conditions": [
312312
{
@@ -333,7 +333,7 @@ def test_multiple_features_enabled(mocker, config):
333333
"feature_default_value": False,
334334
"rules": [
335335
{
336-
"rule_name": "tenant id is contained in [6,2] ",
336+
"rule_name": "tenant id is contained in [6, 2]",
337337
"value_when_applies": True,
338338
"conditions": [
339339
{
@@ -366,7 +366,7 @@ def test_multiple_features_only_some_enabled(mocker, config):
366366
"feature_default_value": False,
367367
"rules": [
368368
{
369-
"rule_name": "tenant id is contained in [6,2] ",
369+
"rule_name": "tenant id is contained in [6, 2]",
370370
"value_when_applies": True,
371371
"conditions": [
372372
{

tests/functional/feature_toggles/test_schema_validation.py

+17-4
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,13 @@ def test_invalid_features_dict():
3333

3434
schema = []
3535
# invalid type
36+
validator = SchemaValidator(schema)
3637
with pytest.raises(ConfigurationError):
3738
validator.validate()
3839

3940
# invalid features key
4041
schema = {FEATURES_KEY: []}
42+
validator = SchemaValidator(schema)
4143
with pytest.raises(ConfigurationError):
4244
validator.validate()
4345

@@ -57,33 +59,38 @@ def test_invalid_feature_dict():
5759

5860
# empty feature dict
5961
schema = {FEATURES_KEY: {"my_feature": {}}}
62+
validator = SchemaValidator(schema)
6063
with pytest.raises(ConfigurationError):
6164
validator.validate()
6265

6366
# invalid FEATURE_DEFAULT_VAL_KEY type, not boolean
6467
schema = {FEATURES_KEY: {"my_feature": {FEATURE_DEFAULT_VAL_KEY: "False"}}}
68+
validator = SchemaValidator(schema)
6569
with pytest.raises(ConfigurationError):
6670
validator.validate()
6771

6872
# invalid FEATURE_DEFAULT_VAL_KEY type, not boolean #2
6973
schema = {FEATURES_KEY: {"my_feature": {FEATURE_DEFAULT_VAL_KEY: 5}}}
74+
validator = SchemaValidator(schema)
7075
with pytest.raises(ConfigurationError):
7176
validator.validate()
7277

7378
# invalid rules type, not list
7479
schema = {FEATURES_KEY: {"my_feature": {FEATURE_DEFAULT_VAL_KEY: False, RULES_KEY: "4"}}}
80+
validator = SchemaValidator(schema)
7581
with pytest.raises(ConfigurationError):
7682
validator.validate()
7783

7884

7985
def test_valid_feature_dict():
80-
# no rules list at all
81-
schema = {FEATURES_KEY: {"my_feature": {FEATURE_DEFAULT_VAL_KEY: False}}}
86+
# empty rules list
87+
schema = {FEATURES_KEY: {"my_feature": {FEATURE_DEFAULT_VAL_KEY: False, RULES_KEY: []}}}
8288
validator = SchemaValidator(schema)
8389
validator.validate()
8490

85-
# empty rules list
86-
schema = {FEATURES_KEY: {"my_feature": {FEATURE_DEFAULT_VAL_KEY: False, RULES_KEY: []}}}
91+
# no rules list at all
92+
schema = {FEATURES_KEY: {"my_feature": {FEATURE_DEFAULT_VAL_KEY: False}}}
93+
validator = SchemaValidator(schema)
8794
validator.validate()
8895

8996

@@ -118,6 +125,7 @@ def test_invalid_rule():
118125
}
119126
}
120127
}
128+
validator = SchemaValidator(schema)
121129
with pytest.raises(ConfigurationError):
122130
validator.validate()
123131

@@ -135,6 +143,7 @@ def test_invalid_rule():
135143
}
136144
}
137145
}
146+
validator = SchemaValidator(schema)
138147
with pytest.raises(ConfigurationError):
139148
validator.validate()
140149

@@ -149,6 +158,7 @@ def test_invalid_rule():
149158
}
150159
}
151160
}
161+
validator = SchemaValidator(schema)
152162
with pytest.raises(ConfigurationError):
153163
validator.validate()
154164

@@ -163,6 +173,7 @@ def test_invalid_rule():
163173
}
164174
}
165175
}
176+
validator = SchemaValidator(schema)
166177
with pytest.raises(ConfigurationError):
167178
validator.validate()
168179

@@ -202,6 +213,7 @@ def test_invalid_condition():
202213
}
203214
}
204215
}
216+
validator = SchemaValidator(schema)
205217
with pytest.raises(ConfigurationError):
206218
validator.validate()
207219

@@ -224,6 +236,7 @@ def test_invalid_condition():
224236
}
225237
}
226238
}
239+
validator = SchemaValidator(schema)
227240
with pytest.raises(ConfigurationError):
228241
validator.validate()
229242

0 commit comments

Comments
 (0)