
    G@d>                     ~   d Z ddlZddlZddlZddlmZ ddlmZmZmZm	Z	 ddl
mZ ddlmZ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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l#m$Z$ ddl%m&Z& ddl'm(Z(m)Z) e&e_&        d Z* G d de          Z+ G d de,          Z- G d de          Z. G d de$          Z/dS )z7Internal shell widget : PythonShellWidget + Interpreter    N)time)
QEventLoopQObjectSignalSlot)QMessageBox)	getargtxtgetdoc	getobjdir	getsourceget_versions)_)Interpreter)to_binary_stringto_text_string)ima)programs)get_error_matchgetcwd_or_home)create_action)PythonShellWidget)oedit)get_conf_pathget_debug_levelc                 Z    | (t                      }d|d         |d         |d         fz  S | S )zCreate internal shell bannerNzPython %s %dbits [%s]pythonbitnesssystemr   )messageversionss     Llib/python3.11/site-packages/spyder/plugins/console/widgets/internalshell.pycreate_bannerr#   -   s?    >>&8$hy&98H;MNO 	O     c                   T    e Zd ZdZ e            Zd Zd Zd Zd Z	e
d             ZdS )	SysOutputzHandle standard I/O queuec                 l    t          j        |            g | _        t          j                    | _        d S N)r   __init__queue	threadingLocklockselfs    r"   r)   zSysOutput.__init__;   s-    
N$$			r$   c                     | j                                          | j                            |           | j                                          | j                                         d S r(   )r-   acquirer*   appendrelease
data_availemit)r/   vals     r"   writezSysOutput.write@   sZ    	
#	r$   c                     | j                                          d                    | j                  }g | _        | j                                          |S )N )r-   r1   joinr*   r3   )r/   ss     r"   empty_queuezSysOutput.empty_queueF   sI    	GGDJ
	r$   c                     d S r(    r.   s    r"   flushzSysOutput.flushN   s    r$   c                     dS )NFr>   r.   s    r"   closedzSysOutput.closedR   s    ur$   N)__name__
__module____qualname____doc__r   r4   r)   r7   r<   r?   propertyrA   r>   r$   r"   r&   r&   7   s|        ##J% % %
         X  r$   r&   c                       e Zd ZdS )WidgetProxyDataN)rB   rC   rD   r>   r$   r"   rH   rH   V   s        Dr$   rH   c                       e Zd ZdZ ee          Z ee          Z eee          Z	 ee          Z
d Zd Zd ZddZd Zdd	Zd
 ZdS )WidgetProxyz"Handle Shell widget refresh signalc                 f    t          j        |            d | _        d | _        d | _        || _        d S r(   )r   r)   	_gotoline_path
input_datainput_condition)r/   rO   s     r"   r)   zWidgetProxy.__init__a   s8     
.r$   c                 :    | j                             |           d S r(   )sig_new_promptr5   r/   prompts     r"   
new_promptzWidgetProxy.new_promptj   s      (((((r$   c                 :    | j                             |           d S r(   )sig_set_readonlyr5   )r/   states     r"   set_readonlyzWidgetProxy.set_readonlym   s    ""5)))))r$   Fc                 <    | j                             ||           d S r(   )sig_editr5   r/   filenameexternal_editors      r"   editzWidgetProxy.editp   s     8_55555r$   c                     | j         t          uS )z&Return True if input data is available)rN   rH   r.   s    r"   data_availablezWidgetProxy.data_availables   s    o55r$   r9   c                 R    t           | _        | j                            |           d S r(   )rH   rN   sig_wait_inputr5   rR   s     r"   
wait_inputzWidgetProxy.wait_inputw   s&    )  (((((r$   c                     | j                                          || _        | j                                          | j                                          d S r(   )rO   r1   rN   notifyr3   r/   cmds     r"   	end_inputzWidgetProxy.end_input{   sN    $$&&&##%%%$$&&&&&r$   NFr9   )rB   rC   rD   rE   r   strrQ   boolrV   rZ   rb   r)   rT   rX   r^   r`   rc   rh   r>   r$   r"   rJ   rJ   Y   s        ,,VC[[Nvd||vc4  HVC[[N/ / /) ) )* * *6 6 6 66 6 6) ) ) )' ' ' ' 'r$   rJ   c                   j    e Zd ZdZ e            Z ee          Z ee          Z e            Z	dg dddddf fd	Z
d Zd Zd	 Zd
 Zd Zd(dZd Zd Z e            d             Zd Zd Zd)dZd*dZd Zd Zd Zd Zd Z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,d'Z* xZ+S )-InternalShellzAShell base widget: link between PythonShellWidget and InterpreterNi,  FTc                    t                                          |t          d          |           || _        |                     |           d | _        d| _        d| _        | j        	                    | j
                   g | _        || _        || _        || _        d | _        | j                            d           t%          t&          d          r!| j        	                    | j                   d S d S )Nzhistory_internal.py)profileFr9   open_in_spyder)superr)   r   multithreadedsetMaximumBlockCount
input_loop
input_modeinterruptedsig_keyboard_interruptconnectkeyboard_interrupt
eventqueueexitfunccommandsr    interpretersig_show_status_requestedr5   hasattrbuiltinssig_go_to_error_requestedopen_with_external_spyder)	r/   parentr}   r    max_line_countr|   rp   rs   	__class__s	           r"   r)   zInternalShell.__init__   s    	/D!E!E!( 	 	* 	* 	* +!!.111  !#++D,CDDD  !  	&++B/// 8-.. 	0*22.0 0 0 0 0	0 	0r$   c                    |                                   | j        | j                                         t          || j        t
          t          t                                | _        | 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        r| j                                         t3          | j                  }|                     |d           | j        D ]}|                     |dd           |                     | j        j                   | j                                          | j        S )zStart Python interpreter.NT)rS   F)historyrT   )!clearr~   closingr   r|   r&   rJ   r   stdout_writer4   ry   stdout_availstderr_writestderr_availwidget_proxyrV   setReadOnlyrQ   rT   rZ   edit_scriptrb   rc   rs   startr#   r    r7   r}   run_commandp1sig_refreshedr5   )r/   	namespacebannerrg   s       r"   start_interpreterzInternalShell.start_interpreter   s   

'$$&&&&y$-'0+'6'8'8: : 	%0889JKKK%0889JKKK%6>>t?OPPP%4<<T_MMM%.66t7GHHH%4<<T_MMM 	%""$$$ t|,,

6$
''' = 	C 	CCS%EBBBB 	(+,,,!!!r$   c                     d| j         _        | j        r,| j         j                            t          d                     | j                                          dS )zExit interpreterT
N)r~   	exit_flagrs   stdin_writer7   r   restore_stdsr.   s    r"   exit_interpreterzInternalShell.exit_interpreter   sW    %)" 	G(../?/E/EFFF%%'''''r$   c                     t          |          }|r|                     |           d S |                                                     |           d S r(   )r   r]   r   r   r[   s      r"   r   zInternalShell.edit_script   sS    !(++ 	0  *****KKMM%%h/////r$   c                 t    | j         j                                        }|r|                     |           dS dS )z@Data is available in stdout, let's empty the queue and write it!N)r~   r   r<   r7   r/   datas     r"   r   zInternalShell.stdout_avail   sC    ,88:: 	JJt	 	r$   c                     | j         j                                        }|r/|                     |d           |                     d           dS dS )z@Data is available in stderr, let's empty the queue and write it!TerrorN)r~   r   r<   r7   r?   r   s     r"   r   zInternalShell.stderr_avail   s[    ,88:: 	#JJt4J(((JJTJ"""""	# 	#r$   r9   c                     |                      |           |                                  d| _        t          d          | _        | j                                         d| _        dS )z"Wait for input (raw_input support)TN)rT   setFocusrv   r   ru   exec_rR   s     r"   rc   zInternalShell.wait_input   sV    $T**r$   c                     d| _         | j                                         | j        j                            |           dS )zEnd of wait_input modeFN)rv   ru   exitr~   r   rh   rf   s     r"   rh   zInternalShell.end_input  s=    %//44444r$   c                     t          j        |            t          | t          d          t	          j        d          | j                  | _        | j        	                    | j                   dS )z$Reimplement PythonShellWidget methodzHelp...DialogHelpButton)icon	triggeredN)
r   setup_context_menur   r   r   r   helphelp_actionmenu	addActionr.   s    r"   r   z InternalShell.setup_context_menu	  sh    ,T222(q|| #); < <%)Y0 0 0 		D,-----r$   c                 N   t          j        | t          d          dt          d          dt          d          dt          d          dt          d	          d
t          d          dt          d          dt          d          dt          d          d           dS )zHelp on Spyder consoleHelpz<b>zShell special commands:z%</b>
                          <p><i>zInternal editor:z;</i><br>    edit foobar.py
                          <p><i>zExternal editor:z<</i><br>    xedit foobar.py
                          <p><i>zRun script:z:</i><br>    run foobar.py
                          <p><i>zRemove references:z7</i><br>    clear x, y
                          <p><i>zSystem commands:z0</i><br>    !ls
                          <p><i>zPython help:z4</i><br>    object?
                          <p><i>zGUI-based editor:z=</i><br>    result = oedit(object)
                          N)r   aboutr   r.   s    r"   r   zInternalShell.help  s     	$&			 "##<!=!=!=!=!"#5!6!6!6!6!"#5!6!6!6!6!"=!1!1!1!1!"#7!8!8!8!8!"#5!6!6!6!6!">!2!2!2!2!"#6!7!7!7!79	: 	: 	: 	: 	:r$   c                     t          t          |                    }|r;|                                \  }}t          j        |t          |                     dS dS )zLoad file in external Spyder's editor, if available
        This method is used only for embedded consoles
        (could also be useful if we ever implement the magic %edit command)N)r   r   groupsr   rq   int)r/   textmatchfnamelnbs        r"   r   z'InternalShell.open_with_external_spyder(  s[      t 4 455 	5JE3#E3s8844444	5 	5r$   c                 "    || _         || _        dS )z-Set external editor path and gotoline option.N)rM   rL   )r/   pathgotolines      r"   set_external_editorz!InternalShell.set_external_editor1  s    
!r$   c                 J   | j         }| j        }t          j                            |          ru	 |g}|dk    r+|r)|                    d                    ||                     t          j        ||           dS # t          $ r | 
                    d|z             Y dS w xY wdS )zx
        Edit in an external editor.

        Recommended: SciTE (e.g. to go to line where an error did occur).
        r   z%s%dz"External editor was not found: %s
N)rM   rL   osr   isfiler2   formatr   run_programOSErrorwrite_error)r/   r\   gotoeditor_pathgoto_optionargss         r"   r]   zInternalShell.external_editor6  s     jn7>>+&& 		88 z!888KKk4 @ @AAA$[$77777 8 8 8   ")+6"7 8 8 8 8 8 88		8 		8s   A	A: :"B B c                 ^    t          j        | ||           | j        rd| _        t          dS )"Reimplement ShellBaseWidget method)r   rS   FN)r   r?   rw   KeyboardInterrupt)r/   r   rS   s      r"   r?   zInternalShell.flushK  s=    E&AAAA 	$$D##	$ 	$r$   c                     |                                   |                     | j        j        r| j        j        n| j        j                   dS )r   N)r   rT   r~   morep2r   r.   s    r"   clear_terminalzInternalShell.clear_terminalT  sC    

t/?/D](++$JZJ]^^^^^r$   c                 d   | j         rt                      }t          d          D ]}|                     |           |                     ddt                      |z
  z  z             |                     | j        j                   n|                     |           |                                  dS )on_enter
   u   
<Δt>=%dms
g      Y@N)	rp   r   rangeexecute_commandinsert_textrT   r~   r    _InternalShell__flush_eventqueue)r/   commandt0r   s       r"   r   zInternalShell.on_enter[  s    < 	*B2YY . .$$W----.#tvvby/BCCCOOD,/0000  )))!!!!!r$   c                 ^    |                      |          rdS |                     |           dS )zO
        Reimplement Qt Method
        Enhanced keypress event handler
        N)preprocess_keyeventpostprocess_keyevent)r/   events     r"   keyPressEventzInternalShell.keyPressEventh  s9    
 ##E** 	F!!%(((((r$   c                     | j         r8| j                             d          }|                     |           | j         6dS dS )zFlush keyboard event queuer   N)r{   popr   )r/   
past_events     r"   __flush_eventqueuez InternalShell.__flush_eventqueuer  sU    o 	2,,Q//J%%j111 o 	2 	2 	2 	2 	2r$   c                 &   | j         r| j                                         dS | j        j        r[|                     d           d| j        _        |                     | j        j                   | j                                         dS d| _        dS )zSimulate keyboard interruptz
KeyboardInterrupt
FTN)	rs   r~   raise_keyboard_interruptr   r   rT   r   resetbufferrw   r.   s    r"   rz   z InternalShell.keyboard_interrupty  s     		(5577777$ (  !8999(- % 0 3444 ,,.....#'   r$   c                 (   |                                 D ]|}|                                }|                    d          r,|                     |t          j        z   d           |                     |dz              |                                  }dS )z
        Execute a set of lines as multiple command
        lines: multiple lines of text to be executed as single commands
        #T)r?   r   N)
splitlinesstrip
startswithr7   r   linesepr   r?   )r/   lineslinestripped_lines       r"   execute_lineszInternalShell.execute_lines  s    
 $$&& 	 	D JJLLM'',, JJtBJdJ333  d+++JJLLLL	 	r$   c                     | j         r|                     |           dS |                    d          r
|dd         }|dk    r|                                  dS |                     |           dS )z[
        Execute a command
        cmd: one-line command only, with '
' at the end
        Nr   r   cls)rv   rh   endswithr   r   rf   s     r"   r   zInternalShell.execute_command  s    
 ? 	NN3F<< 	crc(C%<<!!!Fr$   c                    |sd}n|r|                      |           | j        sd|vrc| j        j                            t          |dz                        | j                                         | j                                         dS |                     t          d          d           dS | j        j                            t          |dz                        dS )zRun command in interpreterr9   inputr   zIn order to use commands like "raw_input" or "input" run Spyder with the multithread option (--multithread) from a system terminalTr   N)
add_to_historyrs   r~   r   r7   r   run_liner   r5   r   )r/   rg   r   rT   s       r"   r   zInternalShell.run_command  s    	)CC )##C(((! 	Mc!! ,220@t0L0LN N N ))+++"'')))))

1 M N N "&  ' ' ' ' '
 (../?d
/K/KLLLLLr$   c                 6    | j                             |          S )zIs text a valid object?)r~   eval)r/   r   s     r"   _evalzInternalShell._eval  s    $$T***r$   c                 X    |                      |          \  }}|rt          |          S dS )zReturn dir(object)N)r   r   r/   objtxtobjvalids       r"   get_dirzInternalShell.get_dir  5    ZZ''
U 	"S>>!	" 	"r$   c                 X    t          | j        j                                                  S )zReturn shell globals() keys)listr~   r   keysr.   s    r"   get_globals_keyszInternalShell.get_globals_keys  s"    D$.3355666r$   c                 B    t          j        t                                S )z'Return shell current directory list dir)r   listdirr   r.   s    r"   get_cdlistdirzInternalShell.get_cdlistdir  s    z.**+++r$   c                 X    |                      |          \  }}|rt          |          S dS )zIs object callable?N)r   callabler   s       r"   
iscallablezInternalShell.iscallable  s5    ZZ''
U 	!C== 	! 	!r$   c                 X    |                      |          \  }}|rt          |          S dS )zGet func/method argument listN)r   r	   r   s       r"   get_arglistzInternalShell.get_arglist  r  r$   c                 H    |                      |          \  }}|r|j        S dS )zGet object __doc__N)r   rE   r   s       r"   
get__doc__zInternalShell.get__doc__  s1    ZZ''
U 	;	 	r$   c                 X    |                      |          \  }}|rt          |          S dS )z#Get object documentation dictionaryN)r   r
   r   s       r"   get_doczInternalShell.get_doc  s5    ZZ''
U 	#;;	 	r$   c                 X    |                      |          \  }}|rt          |          S dS )zGet object sourceN)r   r   r   s       r"   
get_sourcezInternalShell.get_source  r  r$   c                 8    | j                             ||          S )z Return True if object is defined)r~   
is_defined)r/   r   force_imports      r"   r  zInternalShell.is_defined  s    **6<@@@r$   rj   )r   )FF)TTri   ),rB   rC   rD   rE   r   r   rk   r   r   sig_focus_changedr)   r   r   r   r   r   rc   rh   r   r   r   r   r   r]   r?   r   r   r   r   rz   r   r   r   r   r  r  r  r  r  r  r  r  r  __classcell__)r   s   @r"   rn   rn      s       KK
 FHHM !'s !'s "R #dE#"0 "0 "0 "0 "0 "0J        D( ( (0 0 0  # # #   5 5 5. . . 
TVV: : V:,5 5 5" " "
8 8 8 8*$ $ $ $_ _ _" " ") ) )2 2 2( ( (     M M M M.+ + +" " "7 7 7, , ,! ! !" " "    " " "A A A A A A A Ar$   rn   )0rE   r   r   r+   r   qtpy.QtCorer   r   r   r   qtpy.QtWidgetsr   spyder_kernels.utils.dochelpersr	   r
   r   r   spyderr   spyder.api.translationsr   (spyder.plugins.console.utils.interpreterr   spyder.py3compatr   r   spyder.utils.icon_managerr   spyder.utilsr   spyder.utils.miscr   r   spyder.utils.qthelpersr   $spyder.plugins.console.widgets.shellr   4spyder.plugins.variableexplorer.widgets.objecteditorr   spyder.config.baser   r   r#   r&   objectrH   rJ   rn   r>   r$   r"   <module>r+     sm   > =  				           : 9 9 9 9 9 9 9 9 9 9 9 & & & & & &8 8 8 8 8 8 8 8 8 8 8 8        % % % % % % @ @ @ @ @ @ = = = = = = = = ) ) ) ) ) ) ! ! ! ! ! ! = = = = = = = = 0 0 0 0 0 0 B B B B B B F F F F F F = = = = = = = =          >	 	 	 	 	f 	 	 	&' &' &' &' &'' &' &' &'RjA jA jA jA jA% jA jA jA jA jAr$   