1111 SegmentContext ,
1212 SegmentRule ,
1313)
14+ from flag_engine .result .types import SegmentResult
1415from flag_engine .segments .types import ContextValue
1516
16- from flagsmith .types import StreamEvent , TraitConfig
17+ from flagsmith .models import Segment
18+ from flagsmith .types import SegmentMetadata , StreamEvent , TraitConfig
1719
1820OverrideKey = typing .Tuple [
1921 str ,
2426OverridesKey = typing .Tuple [OverrideKey , ...]
2527
2628
29+ def map_segment_results_to_identity_segments (
30+ segment_results : list [SegmentResult ],
31+ ) -> list [Segment ]:
32+ identity_segments : list [Segment ] = []
33+ for segment_result in segment_results :
34+ if raw_metadata := segment_result .get ("metadata" ):
35+ metadata = typing .cast (SegmentMetadata , raw_metadata )
36+ if metadata .get ("source" ) == "api" and (
37+ (flagsmith_id := metadata .get ("flagsmith_id" )) is not None
38+ ):
39+ identity_segments .append (
40+ Segment (
41+ id = flagsmith_id ,
42+ name = segment_result ["name" ],
43+ )
44+ )
45+ return identity_segments
46+
47+
2748def map_sse_event_to_stream_event (event : sseclient .Event ) -> StreamEvent :
2849 event_data = json .loads (event .data )
2950 return {
@@ -90,7 +111,7 @@ def map_environment_document_to_context(
90111 },
91112 "segments" : {
92113 ** {
93- (segment_key := str (segment ["id" ])): {
114+ (segment_key := str (segment_id := segment ["id" ])): {
94115 "key" : segment_key ,
95116 "name" : segment ["name" ],
96117 "rules" : _map_environment_document_rules_to_context_rules (
@@ -101,6 +122,12 @@ def map_environment_document_to_context(
101122 segment .get ("feature_states" ) or []
102123 )
103124 ),
125+ "metadata" : dict (
126+ SegmentMetadata (
127+ flagsmith_id = segment_id ,
128+ source = "api" ,
129+ )
130+ ),
104131 }
105132 for segment in environment_document ["project" ]["segments" ]
106133 },
@@ -142,6 +169,7 @@ def _map_identity_overrides_to_segments(
142169 # Create a segment context for each unique set of overrides
143170 # Generate a unique key to avoid collisions
144171 segment_key = str (hash (overrides_key ))
172+ segment_metadata = SegmentMetadata (source = "identity_overrides" )
145173 segment_contexts [segment_key ] = SegmentContext (
146174 key = "" , # Identity override segments never use % Split operator
147175 name = "identity_overrides" ,
@@ -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 = dict (segment_metadata ),
171200 )
172201 return segment_contexts
173202
0 commit comments