
    G@d+                        d Z ddlZddlZddlmZ ddlZddlmZ ddl	Z	ddl
mZmZmZmZmZ ddlmZmZmZ ddlmZ ddlmZ ddlmZmZmZ dd	lmZ dd
lmZ ddl m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) ddlm*Z* ddl+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z;  ej<        e=          Z> edd          Z? ej@        e?dddd          ZA ej@        e?ddd          ZB eC ej@        eBd                     D                                ZE eC ej@        eBd!                    D                                ZF eC ej@        eBd"                    D                                ZG ed#          H                    e3e2          ZI	 e	jJ         n# eK$ r e	j	        e	_J        Y nw xY w G d$ d%ee;e          ZLdS )&zR
Client widget for the IPython Console.

This is the widget used on all its tabs.
    N)Template)QUrlQTimerSignalSlotQThread)QMessageBoxQVBoxLayoutQWidget)_)SpyderWidgetMixin)get_home_dirget_module_source_pathrunning_under_pytest)ima)
sourcecode)get_image_path)InstallerIPythonKernelError)
get_coding)RemoteEnvDialog)QStylePalette)programs)add_actionsDialogManager)to_text_string)SPYDER_KERNELS_CONDASPYDER_KERNELS_MAX_VERSIONSPYDER_KERNELS_MIN_VERSIONSPYDER_KERNELS_PIPSPYDER_KERNELS_VERSION)ShellWidget)CollectionsEditor)SaveHistoryMixinspyderpluginshelputilsstaticcssipythonconsoleassets	templatesz
blank.htmlzloading.htmlzkernel_error.htmlz>= {0} and < {1}c                       e Zd ZdZ eee          Z e            Z ee          ZdZ	d
                    ej        dz   ej                              ZddgZddddd	d
dd
dd	d
d
d	di ddddf fd	Zd Zd>dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Ze d             Z!d>dZ" e#            d             Z$d>dZ% fdZ&d Z' e#            d              Z(d! Z)d" Z*d# Z+d$ Z,d% Z-d& Z.d' Z/d>d(Z0d) Z1d* Z2d+ Z3 e#            d,             Z4d- Z5d?d.Z6d/ Z7d0 Z8 e#e          d1             Z9 e#            d2             Z: e#            d3             Z; e#            d4             Z< e#            d5             Z= e#            d6             Z> e#            d7             Z?d8 Z@ e#eA          d9             ZB e#eA          d:             ZCd?d;ZD e#eE          d<             ZFd= ZG xZHS )@ClientWidgetz
    Client widget for the IPython Console

    This widget is necessary to handle the interaction between the
    plugin and each shell widget.
    ipython_consolez{0}## ---({1})---   z# -*- coding: utf-8 -*-z+# *** Spyder Python Console History Log ***N FTc           
          t          t                                         |           t          j         |           | _        | _        | _        | _        |
 _        | _	        | _
        | _        | _        | _        | _        | _        |	 _        | _        g  _        d _        d _        d  _        d  _        | _        |t0           _        n| _        t5          | |||||d           _         j        j         _                                          _                                          _         d  _!         "                                 tG          j$                     _%        tM                      _'        tQ                       _)         j)        *                    dddd            j)        +                     j                    j         j)        +                     j                    ,                     j)                    fd _-        t]                       _/        | _0        | _1        | _2         j0         j1        $ j        j3        4                     j5                   d _6        d S )NTF)config	ipyclientadditional_optionsinterpreter_versionsis_external_kernelis_spyder_kernelhandlerslocal_kernelr   c                  :     j                                        S )N)client)	containerclose_clientselfs   Llib/python3.11/site-packages/spyder/plugins/ipythonconsole/widgets/client.py<lambda>z'ClientWidget.__init__.<locals>.<lambda>   s    T^%@%@%@%M%M     )7superr.   __init__r#   r=   id_connection_filehostnamemenu_actionsr7   
given_nameshow_elapsed_timereset_warningask_before_restartask_before_closinginitial_cwdcontext_menu_actionsoptions_buttonhistoryallow_renameis_error_shown
error_textrestart_thread
give_focusCSS_PATHcss_pathr!   shellwidget
infowidget_create_blank_page
blank_page_create_loading_pageloading_page	info_page_before_prompt_is_readytime	monotonict0r   timerr
   layoutsetContentsMargins	addWidget	setLayoutexit_callbackr   dialog_manager
stderr_obj
stdout_obj	fault_objexecutedconnectpoll_std_file_changestart_successful)r@   parentrF   history_filenameconfig_optionsr5   r6   rG   rH   rP   rI   r7   r8   rJ   rW   rQ   rK   rL   rM   rN   rY   r9   rl   rm   rn   rO   	__class__s   `                         rA   rE   zClientWidget.__init__a   ss   * 	lD!!**6222!$(8999  . ("4$!2*"4"4& %9!, #"$$DMM$DM '!1!51-	
 	
 	
 .31133 5577 $$&&& .""D\\
 "mm&&q!Q222d.///?&K!!$/222t{### NMMM ,oo %$"?&$/*E%--d.GHHH %rC   c                     | j         M| j                                         r6| j                                          | j                                          dS dS dS )z Close threads to avoid segfault.N)rV   	isRunningquitwaitr?   s    rA   __del__zClientWidget.__del__   s`    +'1133 ,$$&&&$$&&&&& ,+++rC   c                     |r|                                   | j        j                            | j                   | j        j                            | j                   dS )z)Configuration before kernel is connected.N)_show_loading_pagerZ   sig_prompt_readyrp   _when_prompt_is_readysig_remote_execute)r@   show_loading_pages     rA   ra   z$ClientWidget._before_prompt_is_ready   sp     	&##%%%)11&	( 	( 	( 	+33&	( 	( 	( 	( 	(rC   c                    d| _         |                                  |                                  |                                  |                                  | j        j                            | j                   | j        j	                            | j                   	 | 
                                 n# t          $ r Y nw xY w| j        r | j        j                                         dS dS )z(Configuration after the prompt is shown.TN)rr   _hide_loading_page_show_mpl_backend_errors_check_special_console_error_set_initial_cwd_in_kernelrZ   r~   
disconnectr   r   _connect_control_signalsRuntimeErrorrW   _controlsetFocusr?   s    rA   r   z"ClientWidget._when_prompt_is_ready   s    $!!! 	%%''' 	))+++ 	''))))44&	( 	( 	(+66&	( 	( 	(	))++++ 	 	 	D	 ? 	1%..00000	1 	1s   !B6 6
CCc                     t          t                    }t          d          }t          j        dk    r|                    dd          }t          d          }|                    | j        ||          }|S )5Create html page to show while the kernel is startingloading_spritesnt\/zConnecting to kernel...)rY   loading_imgmessage)	r   LOADINGr   osnamereplacer   
substituterY   )r@   loading_templater   r   pages        rA   r^   z!ClientWidget._create_loading_page   sw    #G,,$%6777d??%--dC88K-..**DM7B3: + < < rC   c                 d    t          t                    }|                    | j                  }|S )r   )rY   )r   BLANKr   rY   )r@   r   r   s      rA   r\   zClientWidget._create_blank_page  s+    #E??**DM*BBrC   c                     | j         T| j                                         | j                                          | j        | _        |                                  dS dS )z+Show animation while the kernel is loading.N)r[   rZ   hideshowr_   r`   set_info_pager?   s    rA   r}   zClientWidget._show_loading_page  s]    ?&!!###O  """!.DN     	 '&rC   c                     | j         9| j                                          | j        | _        |                                  | j                                         dS )z1Hide animation shown while the kernel is loading.N)r[   r   r]   r`   r   rZ   r   r?   s    rA   r   zClientWidget._hide_loading_page  sT    ?&O  """!_DN   rC   c                 $   t          | j        d          }	 |                                }|s	 |                                 dS t	          |          }t          ||          }||                                 S # |                                 w xY w)z#Read the stderr file of the kernel.rb )openstderr_filereadcloser   r   )r@   fstderr_textencodings       rA   _read_stderrzClientWidget._read_stderr  s     !4((	&&((K
   GGIIIII	 "+..H(h??KGGIIIIAGGIIIIs   A9  A9 9Bc                 x    | j         j        r-| j                                                                          dS dS )zT
        Show possible errors when setting the selected Matplotlib backend.
        N)rZ   r8   call_kernelshow_mpl_backend_errorsr?   s    rA   r   z%ClientWidget._show_mpl_backend_errors0  sF     , 	E((**BBDDDDD	E 	ErC   c                 j    | j                             | j                                                   dS )z<Check if the dependecies for special consoles are available.)callbackN)rZ   r   _show_special_console_erroris_special_kernel_validr?   s    rA   r   z)ClientWidget._check_special_console_error7  s8    $$5 	% 	 	%%'''''rC   c                 ~    |:t          d                              |          }|                     |           d S d S )NzYour Python environment or installation doesn't have the <tt>{missing_dependency}</tt> module installed or it occurred a problem importing it. Due to that, it is not possible for Spyder to create this special console for you.)missing_dependency)r   formatshow_kernel_error)r@   r   error_messages      rA   r   z(ClientWidget._show_special_console_error=  sU    )  f(:f;;  ""=11111 *)rC   c                     |                                  sdS | j        rdS | j                                        }|sdS |                                D ]}|r|                     |          s dS dS )z
        Abort kernel restart if there are errors while starting it.

        We also ignore errors about comms, which are irrelevant.
        TF)has_spyder_kernelsrr   rl   get_contents
splitlinesis_benign_error)r@   stderrlines      rA   _abort_kernel_restartz"ClientWidget._abort_kernel_restartI  s     &&(( 	4  	5--// 	5 %%'' 	 	D D0066 tturC   c                    | j         j        }| j         j        }|j                            | j        j                   |j                            | j        j                   |j                            | j        j                   |j                            | j        j                   |j                            | j        j	        j
                   dS )z#Connect signals of control widgets.N)rZ   r   _page_controlsig_focus_changedrp   r=   sig_visibility_changedrefresh_containersig_show_find_widget_requestedfind_widgetr   )r@   controlpage_controls      rA   r   z%ClientWidget._connect_control_signals_  s    "+'5!))N,	. 	. 	.&..N,	. 	. 	.&..N,	. 	. 	.+33N,	. 	. 	.3;;N&+	- 	- 	- 	- 	-rC   c                 ,   t                               d           t                      }| j                                        }d}| j        d         dk    rf|                     dd          rt                      }||}n|                     d	d          r$|                     d
t                      d          }n| j        | j        }n|                     dd          rt                      }||}nn|                     dd          r| j                                        }d}n;|                     dd          r$|                     dt                      d          }t          j
        |          r| j                            ||           dS dS )z"Set the initial cwd in the kernel.z/Setting initial working directory in the kernelTint_id1z%startup/use_project_or_home_directory
workingdirsectionNzstartup/use_fixed_directoryzstartup/fixed_directory)defaultr   z%console/use_project_or_home_directoryzconsole/use_cwdFzconsole/use_fixed_directoryzconsole/fixed_directory)emit_cwd_change)loggerdebugr   r=   get_active_project_pathrF   get_confrO   get_working_directoryospisdirrZ   set_cwd)r@   cwd_pathproject_pathr   s       rA   r   z'ClientWidget._set_initial_cwd_in_kernelo  s   FGGG>>~==?? 8H$$}}7$     (>>++H-$      ==-(NN( )   ++7$     (>>++H0,GG >??AA"'-$      ==-(NN( )   9X 	P$$X$OOOOO	P 	PrC   c                 |    | j         4t          j        | j                   }|                    d          d         S dS )zGet kernel id.Nz.jsonr   )rG   r   basenamesplit)r@   	json_files     rA   	kernel_idzClientWidget.kernel_id  s>     +T%9::I??7++A.. ,+rC   c                 L   	 | j         j                            | j                   n# t          t
          f$ r Y nw xY w|rb| j        | j                                         | j        | j                                         | j	        | j	                                         dS dS dS )z.Remove stderr_file associated with the client.N)
rZ   ro   r   rq   	TypeErrorr   rl   removerm   rn   r@   is_last_clients     rA   remove_std_fileszClientWidget.remove_std_files  s    	%001JKKKK<( 	 	 	D	 	(*&&(((*&&(((~)%%'''''	( 	(
 *)s   $' ;;c                    | j         j        }| j        | j                                        }|r|                     |          rdS | j                                         r?| j        d|z  k    r1| j                                        }|                     d|z             |r|dz   | j         j	        z   | j         _	        n| j         
                    d|z   d           | j        \| j                                        }|rC|r|dz   | j         j	        z   | j         _	        dS | j         
                    d|z   d           dS dS dS )z0Check if the stderr or stdout file just changed.Nz<tt>%s</tt>
Tbefore_prompt)rZ   	_startingrl   poll_file_changer   isHiddenrU   r   r   banner_append_plain_textrm   )r@   startingr   full_stderrstdouts        rA   rq   z!ClientWidget.poll_std_file_change  s    #-?&_5577F ;''// F#,,.. L-&*@@@&*o&B&B&D&D..}{/JKKK ;(8(?? $++ $77vT 8 ; ; ; ?&_5577F ; ;(8(?? $+++ $77vT 8 ; ; ; ; ; '&; ;rC   c                    || _         | j                                                                         | j                                         | j        j                            | j                   | j        j                            | j        j                   | j        j	                            | j
                   | j        j	                            | j        j                   | j        j                            | j                   | j        j	                            | j                   | j        j                            | j                   | j        j                            | j                   | j        j                            | j        j                   | j        j                            | j                   | j        j                            | j                   | j        j	                            | j        j                   |                     | j        j        d           | j        8| j                                                            | j        j                   dS dS )z0Configure shellwidget after kernel is connected.FresetN)rW   rZ   r   _send_comm_configset_exit_callback	executingrp   add_to_historyset_backend_for_mayaviro   update_historyrefresh_namespacebrowsersig_execution_state_changedsig_kernel_restarted_messagekernel_restarted_messagesig_kernel_restarted_finalise_restartchange_mpl_backendsig_show_syspathshow_syspathsig_show_envshow_env
update_cwdset_color_schemesyntax_stylern   enable_faulthandlerfilename)r@   rW   s     rA   configure_shellwidgetz"ClientWidget.configure_shellwidget  sY   $ 	$$&&88::: 	**,,, 	"**4+>??? 	"**3	5 	5 	5 	!))$*=>>> 	!))5	7 	7 	7 	"**,	. 	. 	. 	!)),	. 	. 	. 	5==)	+ 	+ 	+-55"	$ 	$ 	$ 	"**/	1 	1 	1 	)11$2CDDD%--dm<<< 	!))$*:*EFFF 	d.;5III>%((**>>') ) ) ) ) &%rC   c                     | j                                         rdS t          t          |                               |          S )zAdd command to historyN)rZ   is_debuggingrD   r.   r   )r@   commandrv   s     rA   r   zClientWidget.add_to_history  s=    ((** 	F\4((77@@@rC   c                 L    | j         j        p| j                                         S N)rZ   
_executingis_waiting_pdb_inputr?   s    rA   is_client_executingz ClientWidget.is_client_executing  s'     + 8 5577	9rC   c                     | j                                         s|                                  dS | j                             d           dS )z;Method to handle what to do when the stop button is pressedexitN)rZ   r  interrupt_kernelpdb_execute_commandr?   s    rA   stop_button_click_handlerz&ClientWidget.stop_button_click_handler  sP     4466 	9!!#####0088888rC   c                 t   || _         |                     |          rdS t          |           t          j        |          }|r|                    |d          }|                    dd          }t          d          }t          t                    }|	                    | j
        ||          | _        | j        F|                                  | j                                         | j                                         d| _        | j                                         |                     d	           dS )
z0Show kernel initialization errors in infowidget.Nz<br>-z&#8209z*An error ocurred while starting the kernel)rY   r   errorTF)r   )rU   r   r   r   get_eol_charsr   r   r   KERNEL_ERRORr   rY   r`   r[   r   rZ   r   r   rT   shutdownr   )r@   r  eolr   kernel_error_templates        rA   r   zClientWidget.show_kernel_error$  s<   && 	F#E*** &u-- 	/MM#v..E c8,, @AA ( 6 6.99] :   ?&   !!###O  """ # 	!!###U33333rC   c                 B    g d}t          fd|D                       S )z3Decide if an error is benign in order to filter it.)
z"KeyboardInterrupt caught in kernelz:QSocketNotifier: Multiple socket notifiers for same socketz9Tcl_AsyncDelete async handler deleted by the wrong threadz"error in background error handler:z    while executingz"::tcl::Bgerrorz:WARNING: Insecure writes have been enabled via environmentzNo such commz^Note: Debugging will proceed. Set PYDEVD_DISABLE_FILE_VALIDATION=1 to disable this validation.z'The following argument was not expectedc                     g | ]}|v S r1   r1   ).0errr  s     rA   
<listcomp>z0ClientWidget.is_benign_error.<locals>.<listcomp>d  s    :::SC5L:::rC   )any)r@   r  benign_errorss    ` rA   r   zClientWidget.is_benign_errorK  s9    
 
 
. ::::M:::;;;rC   c                 8   | j         E| j        t          d          }n| j        }| j        d         dz   | j        d         z   }|dz   |z   }nM| j         dv r,| j        d         dz   | j        d         z   }| j         dz   |z   }n| j         dz   | j        d         z   }|S )zReturn client nameNConsoler   r   str_id )PylabSymPyCython)rJ   rH   r   rF   )r@   r   	client_ids      rA   get_namezClientWidget.get_namef  s    ?"}$||}*T1DHX4FFI$;*DD_ <<<*T1DHX4FFI?T)I5DD?T)DHX,>>DrC   c                 b    | j         j        }|r|                                r|S | j         j        S )z4Return the text widget (or similar) to give focus to)rZ   r   	isVisibler   )r@   r   s     rA   get_controlzClientWidget.get_controlx  s<     '5 	-L2244 	-#,,rC   c                     | j         j        S )z&Get kernel associated with this client)rZ   kernel_managerr?   s    rA   
get_kernelzClientWidget.get_kernel  s    ..rC   c                 0    t          || j                   |S )z*Add actions to IPython widget context menu)r   rP   )r@   menus     rA   add_actions_to_context_menuz(ClientWidget.add_actions_to_context_menu  s    D$3444rC   c                 \    | j         j                            |           || j         _        dS )zSet IPython widget's fontN)rZ   r   setFontfont)r@   r=  s     rA   set_fontzClientWidget.set_font  s-    !))$/// $rC   c                 `    	 | j                             ||           dS # t          $ r Y dS w xY w)zSet IPython color scheme.N)rZ   r  AttributeError)r@   color_schemer   s      rA   r  zClientWidget.set_color_scheme  sH    	--lEBBBBB 	 	 	DD	s    
--c                 H   	 |                                   n# t          $ r Y nw xY w	 | j        j                            | j                   n# t          t          f$ r Y nw xY w|                     |           |                                  | 	                    d           dS )zClose the client.N)
r  r   re   timeoutr   	show_timer   r  r   	setParentr   s     rA   r>   zClientWidget.close_client  s    	**,,,, 	 	 	D		J))$.9999i( 	 	 	D	 	n%%%

ts    
$$$A A! A!c                    | j                                          | j        i| j                                        rP| j        j                                         | j                                         | j                                         |o| j         o| j	         }| j
                            |           |                     |           dS )z)Shutdown connection and kernel if needed.N)rk   	close_allrV   rx   finishedr   ry   rz   r7   rT   rZ   r  r   )r@   r   shutdown_kernels      rA   r  zClientWidget.shutdown  s    %%'''+'1133 ,(33555$$&&&$$&&& (4#:: ('' 	 	!!/222o.....rC   c                 \    	 | j                                          dS # t          $ r Y dS w xY w)z7Interrupt the associanted Spyder kernel if it's runningN)rZ   request_interrupt_kernelr   r?   s    rA   r  zClientWidget.interrupt_kernel  sD    	5577777 	 	 	DD	s    
++c                 
     j         }t                      sT j        rMt          d          }t          j        t          j        z  }t	          j         t          d          ||          }nd}|t          j        k    st                      s j        s|j        r j	        2 j	        
                                r j	                                                                          r|j                                         dS                                   |j                                         |j                                         d|j        _                             d            j        i j                                        rP j        j                                          j                                          j                                         t3          d           _         j         j        _        d j        _         j        j                             fd            j                                         dS |                    t          d          d	                                              dS dS )
z
        Restart the associated kernel.

        Took this code from the qtconsole project
        Licensed under the BSD license
        z,Are you sure you want to restart the kernel?zRestart kernel?NF)r   c                  .                          d          S )NT)r  r?   s   rA   rB   z-ClientWidget.restart_kernel.<locals>.<lambda>  s    D22488 rC   z.Cannot restart a kernel not started by Spyder
Tr   )!rZ   r   rM   r   r	   YesNoquestionr6  r[   r3  r   r   spyder_kernel_commr   r}   stop_restarterautorestartra   rV   rx   rH  r   ry   rz   r   _restart_thread_mainrunr  rp   startr   r   )r@   swr   buttonsresults   `    rA   restart_kernelzClientWidget.restart_kernel  s    #%% 	$*A 	FGGG!o6G )$2C0D0D*17< <FF Fko%%$&& &+ &   '*?.0022 /,,...--// )//111F''))) %++--- !0022205!- ,,u,EEE '3 /99;; 4'0;;===',,...',,...&-dmm#*.*C#',0#)#,448888: : :#))+++++ %%GHH"& &    '')))))U &%rC   c                     	 | j         j                            | j        j        | j        j                   dS # t          $ r}|| j        _        Y d}~dS d}~ww xY w)zRestart the kernel in a thread.)r   r   N)	rZ   r6  rZ  rl   handlerm   r   rV   r  )r@   es     rA   rT  z!ClientWidget._restart_thread_main  s    	*+::-- ; / / / / /  	* 	* 	*()D%%%%%%%	*s   59 
AAAc                 "   | j         }|                                 r|j                                         dS | j        r?| j        j        3|                    t          d          | j        j        z  d           n^| j        O| j        	                                }|r4| 
                    |          }| j                             d|z   d           d|_        |j                                         	 |j                            |j                   n# t          $ r Y dS w xY wd|j        _        |j                                         |                     |j        |           |                    t          d          d           |                                 | j        6| j                                                             | j        j                   |                                  d| _        | j                                         dS )	z&Finishes the restarting of the kernel.NzError restarting kernel: %s
Tr   r   Fr   z<br>Restarting kernel...<br>)rZ   r   rQ  r   rV   r  r   r   rn   r   filter_fault_pdb_in_loopr   	open_commkernel_clientr@  r6  rS  start_restarterr  r	  _append_htmlinsert_horizontal_rulerr   r
  r  r   r   emit)r@   r   rW  faults       rA   r  zClientWidget._finalise_restart
  s7   %%'' 	!'')))F $	-4#6#<#H!!122T5H5NN" "    
 ~)3355 : --e44E$77uD 8 : : : $BO!((***%//0@AAAA!     -1B)--///
 !!"/!???OOA<==*.  0 0 0&&(((~) ,,..BBN+- - - 	!!!"(--/////s   4D 
D"!D"c                 8   |                      dd          s|                      dd          }t          j        d|t                    }t	          d                              |t          t          t                    }|s| 	                    |           dS d	S d	S )
z
        Check if the kernel has the right Spyder-kernels version and show a
        message in case that's not the true.
        r   main_interpreterr   
executablespyder_kernels)interpreterversiona  The Python environment or installation whose interpreter is located at<pre>    <tt>{0}</tt></pre>doesn't have the <tt>spyder-kernels</tt> module or the right version of it installed ({1}). Without this module is not possible for Spyder to create a console for you.<br><br>You can install it by activating your environment first (if necessary) and then running in a system terminal:<pre>    <tt>{2}</tt></pre>or<pre>    <tt>{3}</tt></pre>FT)
r   r   is_module_installedr    r   r   SPYDER_KERNELS_VERSION_MSGr   r   r   )r@   pyexecr   msgs       rA   r   zClientWidget.has_spyder_kernels<  s    
 }}Y0B}CC %	]]<9K]LLF!)!= "."0 "0 "0
  " !&.(&	 # 0 & &&s+++ut4rC   c           	         d}d}d}t          j        ||          D ]&}t          |                    d          d          }'d}g }d}t          j        ||          D ]M}d |                    d                                          D             }|                                d         }Nd	}	t          t          j        ||                    D ]"\  }
}|
dk    r%|	|||                                d                  z  }	t          |                    d
          d          }||k    r<||v r`d|                    d          v rx|	d|                    d          z   dz   z  }		 d}t          t          j        ||                    d                              }|                                d         }n# t          $ r d}Y nw xY w|	d|                    d          d|         z   dz   z  }	$|	S )z$Get a fault from a previous session.zn(Current thread|Thread) (0x[\da-f]+) \(most recent call first\):(?:.|\r\n|\r|\n)+?(?=Current thread|Thread|\Z)z&Main thread id:(?:
||
)(0x[0-9a-f]+)r         basez;System threads ids:(?:
||
)(0x[0-9a-f]+(?: 0x[0-9a-f]+)+)c                 0    g | ]}t          |d           S )rt  ru  )int)r$  is     rA   r&  z-ClientWidget.filter_fault.<locals>.<listcomp>{  s"    JJJa#ab///JJJrC   r   r0   zwurlitzer.pyr   zP.*(?:/IPython/core/interactiveshell\.py|\\IPython\\core\\interactiveshell\.py).*Nz
Main thread:
)	refinditerrx  groupr   span	enumeratenextStopIteration)r@   rg  thread_regexmain_remain_idmatch	system_re
ignore_ids	start_idxtextidx	thread_idpatternmatch_internalend_idxs                  rA   r_  zClientWidget.filter_faulth  s   > 	 ?[%00 	3 	3E%++a..r222GGD	
	[E22 	( 	(EJJ5;;q>>3G3G3I3IJJJJ

QII#BKe$D$DEE 	M 	MJCaxxi

Q788EKKNN444IG##
**!U[[^^33u{{1~~-44# KG%)"+gu{{1~~*N*N%O%ON,1133A6GG$ # # #"GGG#*U[[^^HWH-EELLs   (AF::G	G	c                 ~    | j         |                                  dS | j                            d|z  d           dS )z$Show kernel restarted/died messages.Nz<br>%s<hr><br>Fr   )rl   rq   rZ   rd  )r@   rq  s     rA   r   z%ClientWidget.kernel_restarted_message  s[     ?& %%'''''))*:S*@8= * ? ? ? ? ?rC   c                 B    | j         j                                         dS )z0Enter and show the array builder on inline mode.N)rZ   r   enter_array_inliner?   s    rA   r  zClientWidget.enter_array_inline  s"     	!4466666rC   c                 B    | j         j                                         dS )z*Enter and show the array builder on table.N)rZ   r   enter_array_tabler?   s    rA   r  zClientWidget.enter_array_table  s"     	!3355555rC   c                 B    | j         j                                         dS )z2Show how to inspect an object with our Help pluginN)rZ   r   inspect_current_objectr?   s    rA   inspect_objectzClientWidget.inspect_object  s"     	!88:::::rC   c                 8    | j                                          dS )zClear a console lineN)rZ   _keyboard_quitr?   s    rA   
clear_linezClientWidget.clear_line  s     	'')))))rC   c                 8    | j                                          dS )zClear the whole consoleN)rZ   clear_consoler?   s    rA   r  zClientWidget.clear_console  s     	&&(((((rC   c                 H    | j                             | j        d           dS )z>Resets the namespace by removing all names defined by the userT)warningr   N)rZ   reset_namespacerL   r?   s    rA   r  zClientWidget.reset_namespace  s6     	((1C15 	) 	7 	7 	7 	7 	7rC   c                 (    | j         j        | _        d S r  )rZ   _historyrR   r?   s    rA   r   zClientWidget.update_history  s    '0rC   c                     |Vt          |           }|                    |ddt          j        d                     | j                            |           dS dS )zShow sys.path contents.Nzsys.path contentsTsyspath)titlereadonlyicon)r"   setupr   r  rk   r   )r@   r  editors      rA   r  zClientWidget.show_syspath  sh     &t,,FLL(;d!hy11  3 3 3$$V,,,,,FrC   c                 X    | j                             t          ||                      dS )zShow environment variables.)rs   N)rk   r   r   )r@   envs     rA   r  zClientWidget.show_env  s.     	  T!B!B!BCCCCCrC   c           	         t          j                    | j        z
  }|dk     rt          j                    | _        d}|dk    rd}nd}|rt          j        }nt          j        }d|dt          j        |t          j        |                    d}| j        r| j	        
                    |           d	S | j	        
                    d           d	S )
zText to show in time_label.r   iQ z%d %H:%M:%Sz%H:%M:%Sz<span style='color: z'><b>z</b></span>r   N)rb   rc   rd   r   COLOR_TEXT_3COLOR_ACCENT_4strftimegmtimerK   sig_time_labelrf  )r@   endelapsed_timefmtcolorr  s         rA   rD  zClientWidget.show_time  s     ~''$'1!n&&DGL)##CCC 	1!.EE!0E % $c4;|3L3L M M M MO ! 	)$$T*****$$R(((((rC   c                     || _         dS )z%Slot to show/hide elapsed time label.N)rK   )r@   states     rA   set_show_elapsed_timez"ClientWidget.set_show_elapsed_time  s     "'rC   c                     | j         @| j        ;| j                             | j        t          j        | j                             dS dS dS )zSet current info_page.N)r[   r`   setHtmlr   fromLocalFilerY   r?   s    rA   r   zClientWidget.set_info_page  sX    ?&4>+EO##"4=11     '&+E+ErC   )T)F)I__name__
__module____qualname____doc__r   strsig_append_to_history_requestedr   r  CONF_SECTIONr   r   lineseprb   ctime	SEPARATORINITHISTORYrE   r{   ra   r   r^   r\   r}   r   r   r   r   r   r   r   r   propertyr   r   r   rq   r  r   r  r  r   r   r1  r4  r7  r:  r>  r  r>   r  r  rZ  rT  r  r   r_  r   r  r  r  r  r  r  r   objectr  r  rD  boolr  r   __classcell__)rv   s   @rA   r.   r.   P   s         '-fS#&6&6#"(&((VC[[N$L#**2:a<FFI,@DK "&&("$)"&   $#(#$($)  !)a& a& a& a& a& a&F' ' '( ( ( (1 1 1@
 
 
  ! ! !       0E E E( ( (
2 
2 
2  ,- - - 2P 2P 2Pj / / X/( ( ( ( 
TVV; ; V;<7) 7) 7) 7)rA A A A A9 9 9 
TVV9 9 V9%4 %4 %4N< < <6  $- - -/ / /  % % %
     &/ / /   
TVV;* ;* V;*z* * *00 00 00 00d* * *X* * *X 
T#YY? ? Y? 
TVV7 7 V7 
TVV6 6 V6 
TVV; ; V; 
TVV* * V* 
TVV) ) V) 
TVV7 7 V7
1 1 1 
T&\\  \ 
T&\\D D \D) ) ) )0 
T$ZZ' ' Z'      rC   r.   )Mr  loggingr   os.pathpathr   rz  stringr   rb   qtpy.QtCorer   r   r   r   r   qtpy.QtWidgetsr	   r
   r   spyder.api.translationsr   spyder.api.widgets.mixinsr   spyder.config.baser   r   r   spyder.utils.icon_managerr   spyder.utilsr   spyder.utils.image_path_managerr   spyder.utils.installersr   spyder.utils.encodingr   spyder.utils.environr   spyder.utils.paletter   r   spyder.utils.qthelpersr   r   spyder.py3compatr   spyder.plugins.ipythonconsoler   r   r   r   r    %spyder.plugins.ipythonconsole.widgetsr!    spyder.widgets.collectionseditorr"   spyder.widgets.mixinsr#   	getLoggerr  r   PLUGINS_PATHjoinrX   TEMPLATES_PATHr   r   r   r   r  r   ro  rc   r@  r.   r1   rC   rA   <module>r     s     				       				        < ; ; ; ; ; ; ; ; ; ; ; ; ; > > > > > > > > > > & % % % % % 7 7 7 7 7 7@ @ @ @ @ @ @ @ @ @ ) ) ) ) ) ) # # # # # # : : : : : : ? ? ? ? ? ? , , , , , , 0 0 0 0 0 0 . . . . . . ! ! ! ! ! ! = = = = = = = = + + + + + +L L L L L L L L L L L L L L > = = = = = > > > > > > 2 2 2 2 2 2 
	8	$	$ &%h	::38L&'8UCC"Hk; ; 	XSXnl334499;;
$xsx77
8
8
=
=
?
?tHCH^-@AABBGGIIQ "$>@ @ NNN   YDNNNh h h h h7,.? h h h h hs   F F.-F.