66
77import sseclient
88from flag_engine .context .types import (
9- EvaluationContext ,
109 FeatureContext ,
1110 SegmentContext ,
1211 SegmentRule ,
1312)
13+ from flag_engine .result .types import SegmentResult
1414from flag_engine .segments .types import ContextValue
1515
16- from flagsmith .types import StreamEvent , TraitConfig
16+ from flagsmith .models import Segment
17+ from flagsmith .types import (
18+ SDKEvaluationContext ,
19+ SegmentMetadata ,
20+ StreamEvent ,
21+ TraitConfig ,
22+ )
1723
1824OverrideKey = typing .Tuple [
1925 str ,
2430OverridesKey = typing .Tuple [OverrideKey , ...]
2531
2632
33+ def map_segment_results_to_identity_segments (
34+ segment_results : list [SegmentResult [SegmentMetadata ]],
35+ ) -> list [Segment ]:
36+ identity_segments : list [Segment ] = []
37+ for segment_result in segment_results :
38+ if metadata := segment_result .get ("metadata" ):
39+ if metadata .get ("source" ) == "api" and (
40+ (flagsmith_id := metadata .get ("flagsmith_id" )) is not None
41+ ):
42+ identity_segments .append (
43+ Segment (
44+ id = flagsmith_id ,
45+ name = segment_result ["name" ],
46+ )
47+ )
48+ return identity_segments
49+
50+
2751def map_sse_event_to_stream_event (event : sseclient .Event ) -> StreamEvent :
2852 event_data = json .loads (event .data )
2953 return {
@@ -45,7 +69,7 @@ def map_environment_document_to_environment_updated_at(
4569
4670
4771def map_context_and_identity_data_to_context (
48- context : EvaluationContext ,
72+ context : SDKEvaluationContext ,
4973 identifier : str ,
5074 traits : typing .Optional [
5175 typing .Mapping [
@@ -56,7 +80,7 @@ def map_context_and_identity_data_to_context(
5680 ],
5781 ]
5882 ],
59- ) -> EvaluationContext :
83+ ) -> SDKEvaluationContext :
6084 return {
6185 ** context ,
6286 "identity" : {
@@ -76,7 +100,7 @@ def map_context_and_identity_data_to_context(
76100
77101def map_environment_document_to_context (
78102 environment_document : dict [str , typing .Any ],
79- ) -> EvaluationContext :
103+ ) -> SDKEvaluationContext :
80104 return {
81105 "environment" : {
82106 "key" : environment_document ["api_key" ],
@@ -90,7 +114,7 @@ def map_environment_document_to_context(
90114 },
91115 "segments" : {
92116 ** {
93- (segment_key := str (segment ["id" ])): {
117+ (segment_key := str (segment_id := segment ["id" ])): {
94118 "key" : segment_key ,
95119 "name" : segment ["name" ],
96120 "rules" : _map_environment_document_rules_to_context_rules (
@@ -101,6 +125,10 @@ def map_environment_document_to_context(
101125 segment .get ("feature_states" ) or []
102126 )
103127 ),
128+ "metadata" : SegmentMetadata (
129+ flagsmith_id = segment_id ,
130+ source = "api" ,
131+ ),
104132 }
105133 for segment in environment_document ["project" ]["segments" ]
106134 },
@@ -113,7 +141,7 @@ def map_environment_document_to_context(
113141
114142def _map_identity_overrides_to_segments (
115143 identity_overrides : list [dict [str , typing .Any ]],
116- ) -> dict [str , SegmentContext ]:
144+ ) -> dict [str , SegmentContext [ SegmentMetadata ] ]:
117145 features_to_identifiers : typing .Dict [
118146 OverridesKey ,
119147 typing .List [str ],
@@ -137,7 +165,7 @@ def _map_identity_overrides_to_segments(
137165 )
138166 )
139167 features_to_identifiers [overrides_key ].append (identity_override ["identifier" ])
140- segment_contexts : typing .Dict [str , SegmentContext ] = {}
168+ segment_contexts : typing .Dict [str , SegmentContext [ SegmentMetadata ] ] = {}
141169 for overrides_key , identifiers in features_to_identifiers .items ():
142170 # Create a segment context for each unique set of overrides
143171 # Generate a unique key to avoid collisions
@@ -168,6 +196,7 @@ def _map_identity_overrides_to_segments(
168196 }
169197 for feature_key , feature_name , feature_enabled , feature_value in overrides_key
170198 ],
199+ metadata = SegmentMetadata (source = "identity_overrides" ),
171200 )
172201 return segment_contexts
173202
0 commit comments