1+ import datetime
12import json
23import logging
34import uuid
@@ -95,14 +96,21 @@ def _get_execute_request(
9596 "session" : self .session_id ,
9697 "msg_type" : "execute_request" ,
9798 "version" : "5.3" ,
99+ "date" : datetime .datetime .now (datetime .timezone .utc ).isoformat (),
98100 },
99101 "parent_header" : {},
100- "metadata" : {},
102+ "metadata" : {
103+ "trusted" : True ,
104+ "deletedCells" : [],
105+ "recordTiming" : False ,
106+ "cellId" : str (uuid .uuid4 ()),
107+ },
101108 "content" : {
102109 "code" : code ,
103110 "silent" : background ,
104111 "store_history" : True ,
105112 "user_expressions" : {},
113+ "stop_on_error" : True ,
106114 "allow_stdin" : False ,
107115 },
108116 }
@@ -127,10 +135,25 @@ async def _wait_for_result(self, message_id: str):
127135
128136 yield output .model_dump (exclude_none = True )
129137
130- async def change_current_directory (self , path : Union [str , StrictStr ]):
138+ async def change_current_directory (
139+ self , path : Union [str , StrictStr ], language : str
140+ ):
131141 message_id = str (uuid .uuid4 ())
132142 self ._executions [message_id ] = Execution (in_background = True )
133- request = self ._get_execute_request (message_id , f"%cd { path } " , True )
143+ if language == "python" :
144+ request = self ._get_execute_request (message_id , f"%cd { path } " , True )
145+ elif language == "deno" :
146+ request = self ._get_execute_request (
147+ message_id , f"Deno.chdir('{ path } ')" , True
148+ )
149+ elif language == "r" :
150+ request = self ._get_execute_request (message_id , f"setwd('{ path } ')" , True )
151+ elif language == "java" :
152+ request = self ._get_execute_request (
153+ message_id , f"System.setProperty('user.dir', '{ path } ')" , True
154+ )
155+ else :
156+ return
134157
135158 await self ._ws .send (request )
136159
@@ -165,11 +188,12 @@ async def execute(
165188 indent = len (line ) - len (line .lstrip ())
166189 break
167190
168- code = (
169- indent * " "
170- + f"os.environ.set_envs_for_execution({ vars_to_set } )\n "
171- + code
172- )
191+ if self .language == "python" :
192+ code = (
193+ indent * " "
194+ + f"os.environ.set_envs_for_execution({ vars_to_set } )\n "
195+ + code
196+ )
173197
174198 logger .info (code )
175199 request = self ._get_execute_request (message_id , code , False )
@@ -192,7 +216,9 @@ async def _receive_message(self):
192216 async for message in self ._ws :
193217 await self ._process_message (json .loads (message ))
194218 except Exception as e :
195- logger .error (f"WebSocket received error while receiving messages: { e } " )
219+ logger .error (
220+ f"WebSocket received error while receiving messages: { type (e )} : { str (e )} "
221+ )
196222
197223 async def _process_message (self , data : dict ):
198224 """
@@ -308,11 +334,21 @@ async def _process_message(self, data: dict):
308334 execution .errored = True
309335 await queue .put (
310336 Error (
311- name = data ["content" ][ "ename" ] ,
312- value = data ["content" ][ "evalue" ] ,
313- traceback = "" .join (data ["content" ][ "traceback" ] ),
337+ name = data ["content" ]. get ( "ename" , "" ) ,
338+ value = data ["content" ]. get ( "evalue" , "" ) ,
339+ traceback = "" .join (data ["content" ]. get ( "traceback" , []) ),
314340 )
315341 )
342+ elif data ["content" ]["status" ] == "abort" :
343+ logger .debug (f"Execution { parent_msg_ig } was aborted" )
344+ await queue .put (
345+ Error (
346+ name = "ExecutionAborted" ,
347+ value = "Execution was aborted" ,
348+ traceback = "" ,
349+ )
350+ )
351+ await queue .put (EndOfExecution ())
316352 elif data ["content" ]["status" ] == "ok" :
317353 pass
318354
0 commit comments