@@ -425,28 +425,7 @@ def parse_output(
425425 on_result : Optional [OutputHandler [Result ]] = None ,
426426 on_error : Optional [OutputHandler [ExecutionError ]] = None ,
427427):
428- data = json .loads (output )
429- data_type = data .pop ("type" )
430-
431- if data_type == "result" :
432- result = Result (** data )
433- execution .results .append (result )
434- if on_result :
435- on_result (result )
436- elif data_type == "stdout" :
437- execution .logs .stdout .append (data ["text" ])
438- if on_stdout :
439- on_stdout (OutputMessage (data ["text" ], data ["timestamp" ], False ))
440- elif data_type == "stderr" :
441- execution .logs .stderr .append (data ["text" ])
442- if on_stderr :
443- on_stderr (OutputMessage (data ["text" ], data ["timestamp" ], True ))
444- elif data_type == "error" :
445- execution .error = ExecutionError (data ["name" ], data ["value" ], data ["traceback" ])
446- if on_error :
447- on_error (execution .error )
448- elif data_type == "number_of_executions" :
449- execution .execution_count = data ["execution_count" ]
428+ _parse_output (execution , output , on_stdout , on_stderr , on_result , on_error )
450429
451430
452431async def async_parse_output (
@@ -457,37 +436,46 @@ async def async_parse_output(
457436 on_result : Optional [OutputHandlerWithAsync [Result ]] = None ,
458437 on_error : Optional [OutputHandlerWithAsync [ExecutionError ]] = None ,
459438):
439+ none_or_awaitable = _parse_output (
440+ execution , output , on_stdout , on_stderr , on_result , on_error
441+ )
442+ if inspect .isawaitable (none_or_awaitable ):
443+ await none_or_awaitable
444+
445+
446+ def _parse_output (
447+ execution : Execution ,
448+ output : str ,
449+ on_stdout : Optional [OutputHandler [OutputMessage ]] = None ,
450+ on_stderr : Optional [OutputHandler [OutputMessage ]] = None ,
451+ on_result : Optional [OutputHandler [Result ]] = None ,
452+ on_error : Optional [OutputHandler [ExecutionError ]] = None ,
453+ ) -> Union [None , Awaitable [Any ]]:
460454 data = json .loads (output )
461455 data_type = data .pop ("type" )
462456
463457 if data_type == "result" :
464458 result = Result (** data )
465459 execution .results .append (result )
466460 if on_result :
467- cb = on_result (result )
468- if inspect .isawaitable (cb ):
469- await cb
461+ return on_result (result )
470462 elif data_type == "stdout" :
471463 execution .logs .stdout .append (data ["text" ])
472464 if on_stdout :
473- cb = on_stdout (OutputMessage (data ["text" ], data ["timestamp" ], False ))
474- if inspect .isawaitable (cb ):
475- await cb
465+ return on_stdout (OutputMessage (data ["text" ], data ["timestamp" ], False ))
476466 elif data_type == "stderr" :
477467 execution .logs .stderr .append (data ["text" ])
478468 if on_stderr :
479- cb = on_stderr (OutputMessage (data ["text" ], data ["timestamp" ], True ))
480- if inspect .isawaitable (cb ):
481- await cb
469+ return on_stderr (OutputMessage (data ["text" ], data ["timestamp" ], True ))
482470 elif data_type == "error" :
483471 execution .error = ExecutionError (data ["name" ], data ["value" ], data ["traceback" ])
484472 if on_error :
485- cb = on_error (execution .error )
486- if inspect .isawaitable (cb ):
487- await cb
473+ return on_error (execution .error )
488474 elif data_type == "number_of_executions" :
489475 execution .execution_count = data ["execution_count" ]
490476
477+ return None
478+
491479
492480@dataclass
493481class Context :
0 commit comments