diff --git a/.gitmodules b/.gitmodules index f85ff0d..c4dd1d0 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.2.0 \ No newline at end of file + tag = v2.4.0 diff --git a/flag_engine/context/types.py b/flag_engine/context/types.py index 193e573..cd41962 100644 --- a/flag_engine/context/types.py +++ b/flag_engine/context/types.py @@ -24,6 +24,7 @@ class EnvironmentContext(TypedDict): class FeatureValue(TypedDict): value: Any weight: float + priority: int class IdentityContext(TypedDict): diff --git a/flag_engine/segments/evaluator.py b/flag_engine/segments/evaluator.py index 2d7d537..81e9fcc 100644 --- a/flag_engine/segments/evaluator.py +++ b/flag_engine/segments/evaluator.py @@ -131,12 +131,12 @@ def get_flag_result_from_feature_context( [feature_context["key"], key] ) - # We expect `variants` to be pre-sorted in order of persistence. This gives us a - # way to ensure that the same value is returned every time we use the same - # percentage value. start_percentage = 0.0 - for variant in variants: + for variant in sorted( + variants, + key=operator.itemgetter("priority"), + ): limit = (weight := variant["weight"]) + start_percentage if start_percentage <= percentage_value < limit: return { diff --git a/tests/engine_tests/engine-test-data b/tests/engine_tests/engine-test-data index c69e2eb..6453b03 160000 --- a/tests/engine_tests/engine-test-data +++ b/tests/engine_tests/engine-test-data @@ -1 +1 @@ -Subproject commit c69e2ebcbc8602a77ddfe98181e01ad5c503417d +Subproject commit 6453b0391344a4d677a97cc4a9d27a8b8e329787 diff --git a/tests/unit/segments/test_segments_evaluator.py b/tests/unit/segments/test_segments_evaluator.py index cd76db5..8a95a5f 100644 --- a/tests/unit/segments/test_segments_evaluator.py +++ b/tests/unit/segments/test_segments_evaluator.py @@ -855,8 +855,8 @@ def test_get_flag_result_from_feature_context__calls_returns_expected( "name": "my_feature", "value": "control", "variants": [ - {"value": "foo", "weight": 30}, - {"value": "bar", "weight": 30}, + {"value": "foo", "weight": 30, "priority": 1}, + {"value": "bar", "weight": 30, "priority": 2}, ], } @@ -897,8 +897,8 @@ def test_get_flag_result_from_feature_context__null_key__calls_returns_expected( "name": "my_feature", "value": "control", "variants": [ - {"value": "foo", "weight": 30}, - {"value": "bar", "weight": 30}, + {"value": "foo", "weight": 30, "priority": 1}, + {"value": "bar", "weight": 30, "priority": 2}, ], }