Skip to content

Commit 42829fa

Browse files
committed
restore override_traits behaviour
1 parent 7f0f21c commit 42829fa

File tree

3 files changed

+34
-16
lines changed

3 files changed

+34
-16
lines changed

flag_engine/context/mappers.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1+
import typing
2+
13
from flag_engine.context.types import EvaluationContext
24
from flag_engine.environments.models import EnvironmentModel
35
from flag_engine.identities.models import IdentityModel
6+
from flag_engine.identities.traits.models import TraitModel
47

58

69
def map_environment_identity_to_context(
710
environment: EnvironmentModel,
811
identity: IdentityModel,
12+
override_traits: typing.Optional[typing.List[TraitModel]],
913
) -> EvaluationContext:
1014
"""
1115
Maps an EnvironmentModel and IdentityModel to an EvaluationContext.
@@ -23,7 +27,12 @@ def map_environment_identity_to_context(
2327
"identifier": identity.identifier,
2428
"key": str(identity.django_id or identity.composite_key),
2529
"traits": {
26-
trait.trait_key: trait.trait_value for trait in identity.identity_traits
30+
trait.trait_key: trait.trait_value
31+
for trait in (
32+
override_traits
33+
if override_traits is not None
34+
else identity.identity_traits
35+
)
2736
},
2837
},
2938
}

flag_engine/engine.py

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import typing
22

33
from flag_engine.context.mappers import map_environment_identity_to_context
4+
from flag_engine.context.types import EvaluationContext
45
from flag_engine.environments.models import EnvironmentModel
56
from flag_engine.features.models import FeatureModel, FeatureStateModel
67
from flag_engine.identities.models import IdentityModel
@@ -54,9 +55,17 @@ def get_identity_feature_states(
5455
:return: list of feature state models based on the environment, any matching
5556
segments and any specific identity overrides
5657
"""
58+
context = map_environment_identity_to_context(
59+
environment=environment,
60+
identity=identity,
61+
override_traits=override_traits,
62+
)
63+
5764
feature_states = list(
5865
_get_identity_feature_states_dict(
59-
environment, identity, override_traits
66+
environment=environment,
67+
identity=identity,
68+
context=context,
6069
).values()
6170
)
6271
if environment.get_hide_disabled_flags():
@@ -80,8 +89,16 @@ def get_identity_feature_state(
8089
:return: feature state model based on the environment, any matching
8190
segments and any specific identity overrides
8291
"""
92+
context = map_environment_identity_to_context(
93+
environment=environment,
94+
identity=identity,
95+
override_traits=override_traits,
96+
)
97+
8398
feature_states = _get_identity_feature_states_dict(
84-
environment, identity, override_traits
99+
environment=environment,
100+
identity=identity,
101+
context=context,
85102
)
86103
matching_feature = next(
87104
filter(lambda feature: feature.name == feature_name, feature_states.keys()),
@@ -97,22 +114,11 @@ def get_identity_feature_state(
97114
def _get_identity_feature_states_dict(
98115
environment: EnvironmentModel,
99116
identity: IdentityModel,
100-
override_traits: typing.Optional[typing.List[TraitModel]],
117+
context: EvaluationContext,
101118
) -> typing.Dict[FeatureModel, FeatureStateModel]:
102119
# Get feature states from the environment
103120
feature_states_by_feature = {fs.feature: fs for fs in environment.feature_states}
104121

105-
context = map_environment_identity_to_context(
106-
environment=environment,
107-
identity=identity,
108-
)
109-
if override_traits:
110-
if typing.TYPE_CHECKING: # pragma: no cover
111-
assert context["identity"]
112-
context["identity"].setdefault("traits", {}).update(
113-
{trait.trait_key: trait.trait_value for trait in override_traits}
114-
)
115-
116122
# Override with any feature states defined by matching segments
117123
for context_segment in get_context_segments(
118124
context=context,

tests/unit/conftest.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,13 @@ def identity(environment: EnvironmentModel) -> IdentityModel:
129129

130130
@pytest.fixture
131131
def context(
132-
environment: EnvironmentModel, identity: IdentityModel
132+
environment: EnvironmentModel,
133+
identity: IdentityModel,
133134
) -> EvaluationContext:
134135
return map_environment_identity_to_context(
135136
environment=environment,
136137
identity=identity,
138+
override_traits=None,
137139
)
138140

139141

@@ -165,6 +167,7 @@ def context_in_segment(
165167
return map_environment_identity_to_context(
166168
environment=environment,
167169
identity=identity_in_segment,
170+
override_traits=None,
168171
)
169172

170173

0 commit comments

Comments
 (0)