77from tornado .queues import Queue
88from tornado .locks import Event
99
10+ from .compiler import (get_file_name , get_tmp_directory , get_tmp_hash_seed )
11+
12+ import debugpy
13+
1014class DebugpyMessageQueue :
1115
1216 HEADER = 'Content-Length: '
@@ -43,43 +47,45 @@ def put_tcp_frame(self, frame):
4347 self .tcp_buffer += frame
4448
4549 self .log .debug ('QUEUE - received frame' )
46- # Finds header
47- if self .header_pos == - 1 :
48- self .header_pos = self .tcp_buffer .find (DebugpyMessageQueue .HEADER )
49- if self .header_pos == - 1 :
50- return
50+ while True :
51+ # Finds header
52+ if self .header_pos == - 1 :
53+ self .header_pos = self .tcp_buffer .find (DebugpyMessageQueue .HEADER )
54+ if self .header_pos == - 1 :
55+ return
5156
52- self .log .debug ('QUEUE - found header at pos %i' , self .header_pos )
53-
54- #Finds separator
55- if self .separator_pos == - 1 :
56- hint = self .header_pos + DebugpyMessageQueue .HEADER_LENGTH
57- self .separator_pos = self .tcp_buffer .find (DebugpyMessageQueue .SEPARATOR , hint )
58- if self .separator_pos == - 1 :
59- return
60-
61- self .log .debug ('QUEUE - found separator at pos %i' , self .separator_pos )
62-
63- if self .message_pos == - 1 :
64- size_pos = self .header_pos + DebugpyMessageQueue .HEADER_LENGTH
65- self .message_pos = self .separator_pos + DebugpyMessageQueue .SEPARATOR_LENGTH
66- self .message_size = int (self .tcp_buffer [size_pos :self .separator_pos ])
67-
68- self .log .debug ('QUEUE - found message at pos %i' , self .message_pos )
69- self .log .debug ('QUEUE - message size is %i' , self .message_size )
70-
71- if len (self .tcp_buffer ) - self .message_pos < self .message_size :
72- return
73-
74- self ._put_message (self .tcp_buffer [self .message_pos :self .message_pos + self .message_size ])
75- if len (self .tcp_buffer ) - self .message_pos == self .message_size :
76- self .log .debug ('QUEUE - resetting tcp_buffer' )
77- self .tcp_buffer = ''
78- self ._reset_tcp_pos ()
79- else :
80- self .log .debug ('QUEUE - slicing tcp_buffer' )
81- self .tcp_buffer = self .tcp_buffer [self .message_pos + self .message_size :]
82- self ._reset_tcp_pos ()
57+ self .log .debug ('QUEUE - found header at pos %i' , self .header_pos )
58+
59+ #Finds separator
60+ if self .separator_pos == - 1 :
61+ hint = self .header_pos + DebugpyMessageQueue .HEADER_LENGTH
62+ self .separator_pos = self .tcp_buffer .find (DebugpyMessageQueue .SEPARATOR , hint )
63+ if self .separator_pos == - 1 :
64+ return
65+
66+ self .log .debug ('QUEUE - found separator at pos %i' , self .separator_pos )
67+
68+ if self .message_pos == - 1 :
69+ size_pos = self .header_pos + DebugpyMessageQueue .HEADER_LENGTH
70+ self .message_pos = self .separator_pos + DebugpyMessageQueue .SEPARATOR_LENGTH
71+ self .message_size = int (self .tcp_buffer [size_pos :self .separator_pos ])
72+
73+ self .log .debug ('QUEUE - found message at pos %i' , self .message_pos )
74+ self .log .debug ('QUEUE - message size is %i' , self .message_size )
75+
76+ if len (self .tcp_buffer ) - self .message_pos < self .message_size :
77+ return
78+
79+ self ._put_message (self .tcp_buffer [self .message_pos :self .message_pos + self .message_size ])
80+ if len (self .tcp_buffer ) - self .message_pos == self .message_size :
81+ self .log .debug ('QUEUE - resetting tcp_buffer' )
82+ self .tcp_buffer = ''
83+ self ._reset_tcp_pos ()
84+ return
85+ else :
86+ self .tcp_buffer = self .tcp_buffer [self .message_pos + self .message_size :]
87+ self .log .debug ('QUEUE - slicing tcp_buffer: %s' , self .tcp_buffer )
88+ self ._reset_tcp_pos ()
8389
8490 async def get_message (self ):
8591 return await self .message_queue .get ()
@@ -217,14 +223,30 @@ def start(self):
217223
218224 self .session .recv (self .shell_socket , mode = 0 )
219225 socket .connect (endpoint )
226+ debugpy .trace_this_thread (False )
220227 return True
221228
222229 def stop (self ):
223230 # TODO
224231 pass
225232
226233 async def dumpCell (self , message ):
227- return {}
234+ code = message ['arguments' ]['code' ]
235+ file_name = get_file_name (code )
236+
237+ with open (file_name , 'w' ) as f :
238+ f .write (code )
239+
240+ reply = {
241+ 'type' : 'response' ,
242+ 'request_seq' : message ['seq' ],
243+ 'success' : True ,
244+ 'command' : message ['command' ],
245+ 'body' : {
246+ 'sourcePath' : file_name
247+ }
248+ }
249+ return reply
228250
229251 async def setBreakpoints (self , message ):
230252 source = message ['arguments' ]['source' ]['path' ];
@@ -244,7 +266,6 @@ async def source(self, message):
244266 reply ['body' ] = {
245267 'content' : f .read ()
246268 }
247-
248269 else :
249270 reply ['success' ] = False
250271 reply ['message' ] = 'source unavailable'
@@ -258,9 +279,14 @@ async def stackTrace(self, message):
258279 [frame for frame in reply ['body' ]['stackFrames' ] if frame ['source' ]['path' ] != '<string>' ]
259280 return reply
260281
282+ def accept_variable (self , variable ):
283+ return variable ['type' ] != 'list' and variable ['type' ] != 'ZMQExitAutocall' and variable ['type' ] != 'dict'
284+
261285 async def variables (self , message ):
262286 reply = await self ._forward_message (message )
263287 # TODO : check start and count arguments work as expected in debugpy
288+ reply ['body' ]['variables' ] = \
289+ [var for var in reply ['body' ]['variables' ] if self .accept_variable (var )]
264290 return reply
265291
266292 async def attach (self , message ):
@@ -296,8 +322,8 @@ async def debugInfo(self, message):
296322 'body' : {
297323 'isStarted' : self .is_started ,
298324 'hashMethod' : 'Murmur2' ,
299- 'hashSeed' : 0 ,
300- 'tmpFilePrefix' : '/tmp/ipykernel_debugger' ,
325+ 'hashSeed' : get_tmp_hash_seed () ,
326+ 'tmpFilePrefix' : get_tmp_directory () ,
301327 'tmpFileSuffix' : '.py' ,
302328 'breakpoints' : breakpoint_list ,
303329 'stoppedThreads' : self .stopped_threads
0 commit comments