22
33from splitcli .experiment .batch_client import BatchClient
44from splitcli .experiment .event_result import EventResult
5+ from splitcli .experiment .generator import events
56
67class Experiment (object ):
7- def __init__ (self , sample , feature , comp_treatment = "on" , key_pattern = "user_{position}" , traffic_type = "user" ):
8+ def __init__ (self , sdk_token , feature , comp_treatment = "on" , key_pattern = "user_{position}" , traffic_type = "user" ):
89 super (Experiment , self ).__init__ ()
10+ self .sdk_token = sdk_token
11+ self .split_client = BatchClient (sdk_token )
912 self .feature = feature
1013 self .comp_treatment = comp_treatment
11- self .sample = sample
1214 self .key_pattern = key_pattern
1315 self .event_results = []
1416 self .traffic_type = traffic_type
1517
16- def register (self , eventType , properties = {}, property_value = None ):
17- event_result = EventResult (eventType , properties , self .sample , property_value = property_value )
18- self .event_results .append (event_result )
19- return event_result
20-
21- def key (self , position ):
22- return self .key_pattern .format (position = position )
23-
24- def run (self , sdk_token ):
25- batch_client = BatchClient (sdk_token )
26- base_sample = 0
27- comp_sample = 0
28- for position in range (self .sample ):
18+ def run (self , sample_size ):
19+ (base_keys , comp_keys ) = self .get_samples (sample_size )
20+ for event_result in self .event_results :
21+ (base_events , comp_events ) = events (event_result , len (base_keys ), len (comp_keys ))
22+ self .send_events (event_result , base_events , base_keys )
23+ self .send_events (event_result , comp_events , comp_keys )
24+ self .split_client .destroy ()
25+
26+ def get_samples (self , sample_size ):
27+ base_keys = []
28+ comp_keys = []
29+ for position in range (sample_size ):
2930 key = self .key (position )
30- treatment = batch_client .get_treatment (key , self .feature )
31+ treatment = self . split_client .get_treatment (key , self .feature )
3132 if treatment == self .comp_treatment :
32- comp_sample += 1
33+ comp_keys . append ( key )
3334 else :
34- base_sample += 1
35+ base_keys .append (key )
36+ return (base_keys , comp_keys )
37+
38+ def send_events (self , event_result , events , keys ):
39+ for (key , (count , value )) in zip (keys ,events ):
40+ properties = event_result .properties
41+ if event_result .property_value is not None :
42+ properties [event_result .property_value ] = value
43+ for _ in range (count ):
44+ time .sleep (.001 )
45+ self .split_client .track (key , self .traffic_type , event_result .event_type , value , properties )
3546
36- for event_result in self .event_results :
37- base_events = event_result .base_events (base_sample )
38- comp_events = event_result .comp_events (comp_sample )
39-
40- base_pos = 0
41- comp_pos = 0
42-
43- for position in range (self .sample ):
44- key = self .key (position )
45- treatment = batch_client .get_treatment (key , self .feature )
46- if treatment == self .comp_treatment :
47- if comp_pos >= len (comp_events ):
48- print (str (len (comp_events )) + " | " + str (comp_sample ) + " | " + str (comp_pos ))
49- (count , value ) = comp_events [comp_pos ]
50-
51- properties = event_result .properties
52- if event_result .property_value is not None :
53- properties [event_result .property_value ] = value
54- self .track (batch_client , key , self .traffic_type , event_result .event_type , properties , count , value )
55- comp_pos += 1
56- else :
57- if base_pos >= len (base_events ):
58- print (str (len (base_events )) + " | " + str (base_sample ) + " | " + str (base_pos ))
59- (count , value ) = base_events [base_pos ]
47+ def key (self , position ):
48+ return self .key_pattern .format (position = position )
6049
61- properties = event_result .properties
62- if event_result .property_value is not None :
63- properties [event_result .property_value ] = value
64- self .track (batch_client , key , self .traffic_type , event_result .event_type , properties , count , value )
65- base_pos += 1
66-
67- batch_client .destroy ()
68-
69- def track (self , split_client , key , traffic_type , event_type , properties , event_count , event_value ):
70- for _ in range (event_count ):
71- time .sleep (.001 )
72- split_client .track (key , traffic_type , event_type , event_value , properties )
50+ def register (self , eventType , properties = {}, property_value = None ):
51+ event_result = EventResult (eventType , properties , property_value = property_value )
52+ self .event_results .append (event_result )
53+ return event_result
0 commit comments