11import typing
22
3+ from flag_engine .context .mappers import map_environment_identity_to_context
4+ from flag_engine .context .types import EvaluationContext
35from flag_engine .environments .models import EnvironmentModel
46from flag_engine .features .models import FeatureModel , FeatureStateModel
57from flag_engine .identities .models import IdentityModel
68from flag_engine .identities .traits .models import TraitModel
7- from flag_engine .segments .evaluator import get_identity_segments
9+ from flag_engine .segments .evaluator import get_context_segments
810from flag_engine .utils .exceptions import FeatureStateNotFound
911
1012
@@ -53,9 +55,17 @@ def get_identity_feature_states(
5355 :return: list of feature state models based on the environment, any matching
5456 segments and any specific identity overrides
5557 """
58+ context = map_environment_identity_to_context (
59+ environment = environment ,
60+ identity = identity ,
61+ override_traits = override_traits ,
62+ )
63+
5664 feature_states = list (
5765 _get_identity_feature_states_dict (
58- environment , identity , override_traits
66+ environment = environment ,
67+ identity = identity ,
68+ context = context ,
5969 ).values ()
6070 )
6171 if environment .get_hide_disabled_flags ():
@@ -79,8 +89,16 @@ def get_identity_feature_state(
7989 :return: feature state model based on the environment, any matching
8090 segments and any specific identity overrides
8191 """
92+ context = map_environment_identity_to_context (
93+ environment = environment ,
94+ identity = identity ,
95+ override_traits = override_traits ,
96+ )
97+
8298 feature_states = _get_identity_feature_states_dict (
83- environment , identity , override_traits
99+ environment = environment ,
100+ identity = identity ,
101+ context = context ,
84102 )
85103 matching_feature = next (
86104 filter (lambda feature : feature .name == feature_name , feature_states .keys ()),
@@ -96,29 +114,33 @@ def get_identity_feature_state(
96114def _get_identity_feature_states_dict (
97115 environment : EnvironmentModel ,
98116 identity : IdentityModel ,
99- override_traits : typing . Optional [ typing . List [ TraitModel ]] ,
117+ context : EvaluationContext ,
100118) -> typing .Dict [FeatureModel , FeatureStateModel ]:
101119 # Get feature states from the environment
102- feature_states = {fs .feature : fs for fs in environment .feature_states }
120+ feature_states_by_feature = {fs .feature : fs for fs in environment .feature_states }
103121
104122 # Override with any feature states defined by matching segments
105- identity_segments = get_identity_segments (environment , identity , override_traits )
106- for matching_segment in identity_segments :
107- for feature_state in matching_segment .feature_states :
108- if feature_state .feature in feature_states :
109- if feature_states [feature_state .feature ].is_higher_segment_priority (
110- feature_state
111- ):
112- continue
113- feature_states [feature_state .feature ] = feature_state
123+ for context_segment in get_context_segments (
124+ context = context ,
125+ segments = environment .project .segments ,
126+ ):
127+ for segment_feature_state in context_segment .feature_states :
128+ if (
129+ feature_state := feature_states_by_feature .get (
130+ segment_feature := segment_feature_state .feature
131+ )
132+ ) and feature_state .is_higher_segment_priority (segment_feature_state ):
133+ continue
134+ feature_states_by_feature [segment_feature ] = segment_feature_state
114135
115136 # Override with any feature states defined directly the identity
116- feature_states .update (
137+ feature_states_by_feature .update (
117138 {
118- fs .feature : fs
119- for fs in identity .identity_features
120- if fs .feature in feature_states
139+ identity_feature : identity_feature_state
140+ for identity_feature_state in identity .identity_features
141+ if (identity_feature := identity_feature_state .feature )
142+ in feature_states_by_feature
121143 }
122144 )
123145
124- return feature_states
146+ return feature_states_by_feature
0 commit comments