Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
[submodule "tests/engine_tests/engine-test-data"]
path = tests/engine_tests/engine-test-data
url = https://github.com/flagsmith/engine-test-data.git
tag = v3.2.0
tag = v3.3.0
40 changes: 19 additions & 21 deletions flag_engine/segments/evaluator.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,45 +139,43 @@ def evaluate_features(
context: EvaluationContext[typing.Any, FeatureMetadataT],
segment_overrides: SegmentOverrides[FeatureMetadataT],
) -> dict[str, FlagResult[FeatureMetadataT]]:
if not (features := context.get("features")):
return {}

flags: dict[str, FlagResult[FeatureMetadataT]] = {}

for feature_context in (context.get("features") or {}).values():
for feature_context in features.values():
feature_name = feature_context["name"]
if segment_override := segment_overrides.get(
feature_context["name"],
):
feature_context = segment_override["feature_context"]
flag_result: FlagResult[FeatureMetadataT]
flags[feature_name] = flag_result = {
"enabled": feature_context["enabled"],
"name": feature_context["name"],
"reason": f"TARGETING_MATCH; segment={segment_override['segment_name']}",
"value": feature_context.get("value"),
}
if feature_metadata := feature_context.get("metadata"):
flag_result["metadata"] = feature_metadata
if segment_override := segment_overrides.get(feature_name):
flags[feature_name] = get_flag_result_from_context(
context=context,
feature_context=segment_override["feature_context"],
reason=f"TARGETING_MATCH; segment={segment_override['segment_name']}",
)
continue
flags[feature_name] = get_flag_result_from_context(
context=context,
feature_name=feature_name,
feature_context=context["features"][feature_name],
reason="DEFAULT",
)

return flags


def get_flag_result_from_context(
context: EvaluationContext[typing.Any, FeatureMetadataT],
feature_name: str,
context: _EvaluationContextAnyMeta,
feature_context: FeatureContext[FeatureMetadataT],
reason: str,
) -> FlagResult[FeatureMetadataT]:
"""
Get a feature value from the evaluation context
for a given feature name.

:param context: the evaluation context
:param feature_name: the feature name to get the value for
:param context: evaluation context
:param feature_context: feature context
:param reason: reason to use when no variant selected
:return: the value for the feature name in the evaluation context
"""
feature_context = context["features"][feature_name]
key = _get_identity_key(context)

flag_result: typing.Optional[FlagResult[FeatureMetadataT]] = None
Expand Down Expand Up @@ -209,7 +207,7 @@ def get_flag_result_from_context(
flag_result = {
"enabled": feature_context["enabled"],
"name": feature_context["name"],
"reason": "DEFAULT",
"reason": reason,
"value": feature_context["value"],
}

Expand Down
2 changes: 1 addition & 1 deletion tests/engine_tests/engine-test-data
Submodule engine-test-data updated 105 files
9 changes: 4 additions & 5 deletions tests/unit/segments/test_segments_evaluator.py
Original file line number Diff line number Diff line change
Expand Up @@ -856,13 +856,13 @@ def test_get_flag_result_from_context__calls_returns_expected(
{"value": "bar", "weight": 30, "priority": 2},
],
}
context["features"]["my_feature"] = feature_context
context["identity"] = {"identifier": expected_key, "key": expected_key}

# When
result = get_flag_result_from_context(
context=context,
feature_name="my_feature",
feature_context=feature_context,
reason="DEFAULT",
)

# the value of the feature state is correct based on the percentage value returned
Expand Down Expand Up @@ -899,15 +899,14 @@ def test_get_flag_result_from_feature_context__null_key__calls_returns_expected(
],
}

context["features"]["my_feature"] = feature_context

# no identity context present
context["identity"] = None

# When
result = get_flag_result_from_context(
context=context,
feature_name="my_feature",
feature_context=feature_context,
reason="DEFAULT",
)

# Then
Expand Down