@@ -223,7 +223,7 @@ def _resolve_callable_reference_from_source(
223223 try :
224224 if "__builtins__" not in globals_dict :
225225 globals_dict ["__builtins__" ] = __builtins__
226- exec (compile (textwrap .dedent (source ), filename = "<summoner_run_while >" , mode = "exec" ), globals_dict )
226+ exec (compile (textwrap .dedent (source ), filename = "<summoner_callable >" , mode = "exec" ), globals_dict )
227227 except Exception :
228228 return None
229229
@@ -233,16 +233,19 @@ def _resolve_callable_reference_from_source(
233233 return None
234234
235235
236- def _resolve_run_while_spec (
236+ def _resolve_callable_spec (
237237 globals_dict : dict [str , Any ],
238238 kind : str ,
239239 value : Any ,
240240 name : Optional [str ],
241241 source : Optional [str ] = None ,
242+ * ,
243+ spec_name : str ,
244+ allow_bool : bool = False ,
242245 ) -> Any :
243246 if kind == "none" :
244247 return None
245- if kind == "bool" :
248+ if allow_bool and kind == "bool" :
246249 return bool (value )
247250 if kind == "callable" :
248251 resolved = _resolve_callable_reference (globals_dict , name )
@@ -251,10 +254,45 @@ def _resolve_run_while_spec(
251254 if callable (resolved ):
252255 return resolved
253256 raise ValueError (
254- "Could not resolve serialized run_while callable "
257+ f "Could not resolve serialized { spec_name } callable "
255258 f"{ name !r} from available replay context"
256259 )
257- raise ValueError (f"Unknown run_while kind { kind !r} " )
260+ raise ValueError (f"Unknown { spec_name } kind { kind !r} " )
261+
262+
263+ def _resolve_run_while_spec (
264+ globals_dict : dict [str , Any ],
265+ kind : str ,
266+ value : Any ,
267+ name : Optional [str ],
268+ source : Optional [str ] = None ,
269+ ) -> Any :
270+ return _resolve_callable_spec (
271+ globals_dict ,
272+ kind ,
273+ value ,
274+ name ,
275+ source ,
276+ spec_name = "run_while" ,
277+ allow_bool = True ,
278+ )
279+
280+
281+ def _resolve_when_data_spec (
282+ globals_dict : dict [str , Any ],
283+ kind : str ,
284+ value : Any ,
285+ name : Optional [str ],
286+ source : Optional [str ] = None ,
287+ ) -> Any :
288+ return _resolve_callable_spec (
289+ globals_dict ,
290+ kind ,
291+ value ,
292+ name ,
293+ source ,
294+ spec_name = "when_data" ,
295+ )
258296
259297
260298class ClientMerger (SummonerClient ):
@@ -930,6 +968,15 @@ def initiate_senders(self):
930968 dna .get ("run_while_name" , None ),
931969 dna .get ("run_while_source" , None ),
932970 )
971+ when_data = dna .get ("when_data" )
972+ if when_data is None :
973+ when_data = _resolve_when_data_spec (
974+ fn_clone .__globals__ ,
975+ dna .get ("when_data_kind" , "none" ),
976+ dna .get ("when_data_value" , None ),
977+ dna .get ("when_data_name" , None ),
978+ dna .get ("when_data_source" , None ),
979+ )
933980 self .send (
934981 route ,
935982 multi = dna .get ("multi" , False ),
@@ -939,6 +986,7 @@ def initiate_senders(self):
939986 data_mode = dna .get ("data_mode" , None ),
940987 every = dna .get ("every" , None ),
941988 run_while = run_while ,
989+ when_data = when_data ,
942990 )(fn_clone )
943991 except Exception as e :
944992 self .logger .warning (
@@ -971,6 +1019,13 @@ def initiate_senders(self):
9711019 entry .get ("run_while_name" , None ),
9721020 entry .get ("run_while_source" , None ),
9731021 )
1022+ when_data = _resolve_when_data_spec (
1023+ g ,
1024+ entry .get ("when_data_kind" , "none" ),
1025+ entry .get ("when_data_value" , None ),
1026+ entry .get ("when_data_name" , None ),
1027+ entry .get ("when_data_source" , None ),
1028+ )
9741029 dec = self .send (
9751030 route ,
9761031 multi = entry .get ("multi" , False ),
@@ -980,6 +1035,7 @@ def initiate_senders(self):
9801035 data_mode = entry .get ("data_mode" , None ),
9811036 every = entry .get ("every" , None ),
9821037 run_while = run_while ,
1038+ when_data = when_data ,
9831039 )
9841040 self ._apply_with_source_patch (dec , fn , entry ["source" ])
9851041
@@ -1341,6 +1397,13 @@ def initiate_senders(self):
13411397 entry .get ("run_while_name" , None ),
13421398 entry .get ("run_while_source" , None ),
13431399 )
1400+ when_data = _resolve_when_data_spec (
1401+ g ,
1402+ entry .get ("when_data_kind" , "none" ),
1403+ entry .get ("when_data_value" , None ),
1404+ entry .get ("when_data_name" , None ),
1405+ entry .get ("when_data_source" , None ),
1406+ )
13441407 dec = self .send (
13451408 route ,
13461409 multi = entry .get ("multi" , False ),
@@ -1350,6 +1413,7 @@ def initiate_senders(self):
13501413 data_mode = entry .get ("data_mode" , None ),
13511414 every = entry .get ("every" , None ),
13521415 run_while = run_while ,
1416+ when_data = when_data ,
13531417 )
13541418 self ._apply_with_source_patch (dec , fn , entry ["source" ])
13551419
0 commit comments