From acf2680dca7c71d314857e72e53b1f9fb93b5bba Mon Sep 17 00:00:00 2001 From: Kim Gustyr Date: Fri, 10 Oct 2025 17:25:31 +0100 Subject: [PATCH 1/5] feat: Support segment metadata --- flag_engine/context/types.py | 5 +++-- flag_engine/result/types.py | 7 ++++--- flag_engine/segments/evaluator.py | 13 +++++++------ 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/flag_engine/context/types.py b/flag_engine/context/types.py index 8680280..06e4848 100644 --- a/flag_engine/context/types.py +++ b/flag_engine/context/types.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: -# filename: https://raw.githubusercontent.com/Flagsmith/flagsmith/main/sdk/evaluation-context.json # noqa: E501 -# timestamp: 2025-08-25T11:10:31+00:00 +# filename: https://raw.githubusercontent.com/Flagsmith/flagsmith/main/sdk/evaluation-context.json +# timestamp: 2025-10-10T16:01:57+00:00 from __future__ import annotations @@ -63,6 +63,7 @@ class SegmentContext(TypedDict): name: str rules: List[SegmentRule] overrides: NotRequired[List[FeatureContext]] + metadata: NotRequired[Dict[str, Any]] class EvaluationContext(TypedDict): diff --git a/flag_engine/result/types.py b/flag_engine/result/types.py index e64239e..a80ba19 100644 --- a/flag_engine/result/types.py +++ b/flag_engine/result/types.py @@ -1,10 +1,10 @@ # generated by datamodel-codegen: -# filename: https://raw.githubusercontent.com/Flagsmith/flagsmith/refs/heads/chore/improve-evaluation-result/sdk/evaluation-result.json # noqa: E501 -# timestamp: 2025-10-01T11:31:34+00:00 +# filename: https://raw.githubusercontent.com/Flagsmith/flagsmith/refs/heads/main/sdk/evaluation-result.json +# timestamp: 2025-10-10T16:01:29+00:00 from __future__ import annotations -from typing import Any, Dict, List, TypedDict +from typing import Any, Dict, List, NotRequired, TypedDict class FlagResult(TypedDict): @@ -18,6 +18,7 @@ class FlagResult(TypedDict): class SegmentResult(TypedDict): key: str name: str + metadata: NotRequired[Dict[str, Any]] class EvaluationResult(TypedDict): diff --git a/flag_engine/segments/evaluator.py b/flag_engine/segments/evaluator.py index 2f29334..f82f2b3 100644 --- a/flag_engine/segments/evaluator.py +++ b/flag_engine/segments/evaluator.py @@ -48,12 +48,13 @@ def get_evaluation_result(context: EvaluationContext) -> EvaluationResult: if not is_context_in_segment(context, segment_context): continue - segments.append( - { - "key": segment_context["key"], - "name": segment_context["name"], - } - ) + segment_result: SegmentResult = { + "key": segment_context["key"], + "name": segment_context["name"], + } + if metadata := segment_context.get("metadata"): + segment_result["metadata"] = metadata + segments.append(segment_result) if overrides := segment_context.get("overrides"): for override_feature_context in overrides: From 6d9e24d677ef2f73e6a6689d824f46563db45dc6 Mon Sep 17 00:00:00 2001 From: Kim Gustyr Date: Fri, 10 Oct 2025 17:25:55 +0100 Subject: [PATCH 2/5] sort engine tests --- tests/engine_tests/test_engine.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/engine_tests/test_engine.py b/tests/engine_tests/test_engine.py index e18dcd3..3b5a67b 100644 --- a/tests/engine_tests/test_engine.py +++ b/tests/engine_tests/test_engine.py @@ -40,7 +40,10 @@ def _extract_benchmark_contexts( yield pyjson5.loads((test_cases_dir_path / file_path).read_text())["context"] -TEST_CASES = list(_extract_test_cases(TEST_CASES_PATH)) +TEST_CASES = sorted( + _extract_test_cases(TEST_CASES_PATH), + key=lambda param: str(param.id), +) BENCHMARK_CONTEXTS = list(_extract_benchmark_contexts(TEST_CASES_PATH)) From 5ffcebf69bd14d13c6536adfa178ec7bec45776a Mon Sep 17 00:00:00 2001 From: Kim Gustyr Date: Fri, 10 Oct 2025 17:26:17 +0100 Subject: [PATCH 3/5] point to `test_segment__with_metadata__match__metadata_in_result` --- .gitmodules | 2 +- tests/engine_tests/engine-test-data | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index f007461..e3d41f8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -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 = v2.0.0 + branch = feat/segment-metadata diff --git a/tests/engine_tests/engine-test-data b/tests/engine_tests/engine-test-data index 5750d53..50f9f3d 160000 --- a/tests/engine_tests/engine-test-data +++ b/tests/engine_tests/engine-test-data @@ -1 +1 @@ -Subproject commit 5750d5380415676d909f28dd7bd64f2cfbe6c6bd +Subproject commit 50f9f3d9b33b2eedf556fb17d579487ca340296b From 3dfcaa50a4d816ba152863682b4d555a2077fe5f Mon Sep 17 00:00:00 2001 From: Kim Gustyr Date: Fri, 10 Oct 2025 17:31:35 +0100 Subject: [PATCH 4/5] fix typing --- flag_engine/result/types.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/flag_engine/result/types.py b/flag_engine/result/types.py index a80ba19..1404d1c 100644 --- a/flag_engine/result/types.py +++ b/flag_engine/result/types.py @@ -4,7 +4,9 @@ from __future__ import annotations -from typing import Any, Dict, List, NotRequired, TypedDict +from typing import Any, Dict, List, TypedDict + +from typing_extensions import NotRequired class FlagResult(TypedDict): From 0a534bc76ec2140dcb0e77e43cbc1bef3dbf79e1 Mon Sep 17 00:00:00 2001 From: Kim Gustyr Date: Fri, 10 Oct 2025 18:08:23 +0100 Subject: [PATCH 5/5] bump engine-test-data --- .gitmodules | 2 +- tests/engine_tests/engine-test-data | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index e3d41f8..32a69b0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -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 - branch = feat/segment-metadata + tag = v2.1.0 diff --git a/tests/engine_tests/engine-test-data b/tests/engine_tests/engine-test-data index 50f9f3d..37606e4 160000 --- a/tests/engine_tests/engine-test-data +++ b/tests/engine_tests/engine-test-data @@ -1 +1 @@ -Subproject commit 50f9f3d9b33b2eedf556fb17d579487ca340296b +Subproject commit 37606e4437d1bd0ee6d86d79828c70a46e94fc8e