Skip to content

Commit fa5907d

Browse files
authored
fix: Multivariate segment overrides not supported (#279)
1 parent 548ddf6 commit fa5907d

File tree

4 files changed

+25
-28
lines changed

4 files changed

+25
-28
lines changed

.gitmodules

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
[submodule "tests/engine_tests/engine-test-data"]
22
path = tests/engine_tests/engine-test-data
33
url = https://github.com/flagsmith/engine-test-data.git
4-
tag = v3.2.0
4+
tag = v3.3.0

flag_engine/segments/evaluator.py

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -139,45 +139,43 @@ def evaluate_features(
139139
context: EvaluationContext[typing.Any, FeatureMetadataT],
140140
segment_overrides: SegmentOverrides[FeatureMetadataT],
141141
) -> dict[str, FlagResult[FeatureMetadataT]]:
142+
if not (features := context.get("features")):
143+
return {}
144+
142145
flags: dict[str, FlagResult[FeatureMetadataT]] = {}
143146

144-
for feature_context in (context.get("features") or {}).values():
147+
for feature_context in features.values():
145148
feature_name = feature_context["name"]
146-
if segment_override := segment_overrides.get(
147-
feature_context["name"],
148-
):
149-
feature_context = segment_override["feature_context"]
150-
flag_result: FlagResult[FeatureMetadataT]
151-
flags[feature_name] = flag_result = {
152-
"enabled": feature_context["enabled"],
153-
"name": feature_context["name"],
154-
"reason": f"TARGETING_MATCH; segment={segment_override['segment_name']}",
155-
"value": feature_context.get("value"),
156-
}
157-
if feature_metadata := feature_context.get("metadata"):
158-
flag_result["metadata"] = feature_metadata
149+
if segment_override := segment_overrides.get(feature_name):
150+
flags[feature_name] = get_flag_result_from_context(
151+
context=context,
152+
feature_context=segment_override["feature_context"],
153+
reason=f"TARGETING_MATCH; segment={segment_override['segment_name']}",
154+
)
159155
continue
160156
flags[feature_name] = get_flag_result_from_context(
161157
context=context,
162-
feature_name=feature_name,
158+
feature_context=context["features"][feature_name],
159+
reason="DEFAULT",
163160
)
164161

165162
return flags
166163

167164

168165
def get_flag_result_from_context(
169-
context: EvaluationContext[typing.Any, FeatureMetadataT],
170-
feature_name: str,
166+
context: _EvaluationContextAnyMeta,
167+
feature_context: FeatureContext[FeatureMetadataT],
168+
reason: str,
171169
) -> FlagResult[FeatureMetadataT]:
172170
"""
173171
Get a feature value from the evaluation context
174172
for a given feature name.
175173
176-
:param context: the evaluation context
177-
:param feature_name: the feature name to get the value for
174+
:param context: evaluation context
175+
:param feature_context: feature context
176+
:param reason: reason to use when no variant selected
178177
:return: the value for the feature name in the evaluation context
179178
"""
180-
feature_context = context["features"][feature_name]
181179
key = _get_identity_key(context)
182180

183181
flag_result: typing.Optional[FlagResult[FeatureMetadataT]] = None
@@ -209,7 +207,7 @@ def get_flag_result_from_context(
209207
flag_result = {
210208
"enabled": feature_context["enabled"],
211209
"name": feature_context["name"],
212-
"reason": "DEFAULT",
210+
"reason": reason,
213211
"value": feature_context["value"],
214212
}
215213

Submodule engine-test-data updated 105 files

tests/unit/segments/test_segments_evaluator.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -856,13 +856,13 @@ def test_get_flag_result_from_context__calls_returns_expected(
856856
{"value": "bar", "weight": 30, "priority": 2},
857857
],
858858
}
859-
context["features"]["my_feature"] = feature_context
860859
context["identity"] = {"identifier": expected_key, "key": expected_key}
861860

862861
# When
863862
result = get_flag_result_from_context(
864863
context=context,
865-
feature_name="my_feature",
864+
feature_context=feature_context,
865+
reason="DEFAULT",
866866
)
867867

868868
# the value of the feature state is correct based on the percentage value returned
@@ -899,15 +899,14 @@ def test_get_flag_result_from_feature_context__null_key__calls_returns_expected(
899899
],
900900
}
901901

902-
context["features"]["my_feature"] = feature_context
903-
904902
# no identity context present
905903
context["identity"] = None
906904

907905
# When
908906
result = get_flag_result_from_context(
909907
context=context,
910-
feature_name="my_feature",
908+
feature_context=feature_context,
909+
reason="DEFAULT",
911910
)
912911

913912
# Then

0 commit comments

Comments
 (0)