
    Je>                     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/y)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                 @    | t               }d|d   |d   |d   fz  S | S )zCreate internal shell bannerzPython %s %dbits [%s]pythonbitnesssystemr   )messageversionss     N/usr/lib/python3/dist-packages/spyder/plugins/console/widgets/internalshell.pycreate_bannerr#   -   s=    >&8$hy&98H;MNO 	O     c                   F    e Zd ZdZ e       Zd Zd Zd Zd Z	e
d        Zy)	SysOutputzHandle standard I/O queuec                 n    t        j                  |        g | _        t        j                         | _        y N)r   __init__queue	threadingLocklockselfs    r"   r)   zSysOutput.__init__;   s%    
NN$	r$   c                     | j                   j                          | j                  j                  |       | j                   j	                          | j
                  j                          y r(   )r-   acquirer*   appendrelease
data_availemit)r/   vals     r"   writezSysOutput.write@   sD    		

#		r$   c                     | j                   j                          dj                  | j                        }g | _        | j                   j	                          |S )N )r-   r1   joinr*   r3   )r/   ss     r"   empty_queuezSysOutput.empty_queueF   s@    		GGDJJ
		r$   c                      y r(    r.   s    r"   flushzSysOutput.flushN   s    r$   c                      y)NFr>   r.   s    r"   closedzSysOutput.closedR   s    r$   N)__name__
__module____qualname____doc__r   r4   r)   r7   r<   r?   propertyrA   r>   r$   r"   r&   r&   7   s4    #J%
  r$   r&   c                       e Zd Zy)WidgetProxyDataN)rB   rC   rD   r>   r$   r"   rH   rH   V   s    r$   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y	)WidgetProxyz"Handle Shell widget refresh signalc                 f    t        j                  |        d | _        d | _        d | _        || _        y r(   )r   r)   	_gotoline_path
input_datainput_condition)r/   rO   s     r"   r)   zWidgetProxy.__init__a   s/     
.r$   c                 :    | j                   j                  |       y r(   )sig_new_promptr5   r/   prompts     r"   
new_promptzWidgetProxy.new_promptj   s      (r$   c                 :    | j                   j                  |       y r(   )sig_set_readonlyr5   )r/   states     r"   set_readonlyzWidgetProxy.set_readonlym   s    ""5)r$   c                 <    | j                   j                  ||       y r(   )sig_editr5   r/   filenameexternal_editors      r"   editzWidgetProxy.editp   s    8_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$   c                 P    t         | _        | j                  j                  |       y r(   )rH   rN   sig_wait_inputr5   rR   s     r"   
wait_inputzWidgetProxy.wait_inputw   s    )  (r$   c                     | j                   j                          || _        | j                   j                          | j                   j	                          y r(   )rO   r1   rN   notifyr3   r/   cmds     r"   	end_inputzWidgetProxy.end_input{   s?    $$&##%$$&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   sP    ,C[Nd|c4 HC[N/)*66)'r$   rJ   c                   F    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      |       || _        | j	                  |       d | _        d| _        d| _        | j                  j                  | j                         g | _        || _        || _        || _        d | _        | j                   j#                  d       t%        t&        d      r&| j(                  j                  | j*                         y y )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!( 	 	* +!!.1  !##++D,C,CD  !  	&&++B/ 8-.**22..0 /r$   c                    | j                          | j                  | 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(                         | j                  j                  j*                  j                  | j,                         | j.                  r| j                  j1                          t3        | j4                        }| j7                  |d       | j8                  D ]  }| j;                  |dd        | j%                  | j                  j<                         | j>                  jA                          | j                  S )zStart Python interpreter.T)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: 	%%00889J9JK%%00889J9JK%%66>>t?O?OP%%44<<T__M%%..66t7G7GH%%44<<T__M""$ t||,

6$
' == 	CCS%EB	C 	((++,!r$   c                     d| j                   _        | j                  r.| j                   j                  j	                  t        d             | j                   j                          y)zExit interpreterT
N)r~   	exit_flagrs   stdin_writer7   r   restore_stdsr.   s    r"   exit_interpreterzInternalShell.exit_interpreter   sK    %)"((../?/EF%%'r$   c                     t        |      }|r| j                  |       y | j                         j                  |       y r(   )r   r]   r   r   r[   s      r"   r   zInternalShell.edit_script   s1    !(+  *KKM%%h/r$   c                 t    | j                   j                  j                         }|r| j                  |       yy)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   s0    ,,88:JJt r$   c                     | j                   j                  j                         }|r&| j                  |d       | j	                  d       yy)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   sB    ,,88:JJt4J(JJTJ" r$   c                     | j                  |       | j                          d| _        t        d      | _        | j                  j                          d| _        y)z"Wait for input (raw_input support)TN)rT   setFocusrv   r   ru   exec_rR   s     r"   rc   zInternalShell.wait_input   sA    $T*r$   c                     d| _         | j                  j                          | j                  j                  j                  |       y)zEnd of wait_input modeFN)rv   ru   exitr~   r   rh   rf   s     r"   rh   zInternalShell.end_input  s3    %%//4r$   c                     t        j                  |        t        | t        d      t	        j
                  d      | j                        | _        | j                  j                  | j                         y)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	  sS    ,,T2(q| #); <%)YY0 			D,,-r$   c                    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       y)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  sg     	$&	 "##<!=!"#5!6!"#5!6!"=!1!"#7!8!"#5!6!">!2!"#6!79	:r$   c                     t        t        |            }|r3|j                         \  }}t        j                  |t        |             yy)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5JE3##E3s84 r$   c                      || _         || _        y)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                  }t        j                  j	                  |      rC	 |g}|dkD  r#|r!|j                  dj                  ||             t        j                  ||       yy# t        $ r | j                  d|z         Y yw xY w)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     jjnn77>>+&8 z!8KKk4 @A$$[$7 '  8   ")+6"7 88s   AA< <BBc                 f    t        j                  | ||       | j                  rd| _        t        y)"Reimplement ShellBaseWidget method)r   rS   FN)r   r?   rw   KeyboardInterrupt)r/   r   rS   s      r"   r?   zInternalShell.flushK  s0    E&A$D## r$   c                     | j                          | j                  | j                  j                  r| j                  j                         y| j                  j
                         y)r   N)r   rT   r~   morep2r   r.   s    r"   clear_terminalzInternalShell.clear_terminalT  sB    

t/?/?/D/D((++^$JZJZJ]J]^r$   c                 D   | j                   rst               }t        d      D ]  }| j                  |        | j	                  ddt               |z
  z  z         | j                  | j                  j                         n| j                  |       | j                          y)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2Y .$$W-..#tvby/BCOOD,,//0  )!r$   c                 J    | j                  |      ry| j                  |       y)zO
        Reimplement Qt Method
        Enhanced keypress event handler
        N)preprocess_keyeventpostprocess_keyevent)r/   events     r"   keyPressEventzInternalShell.keyPressEventh  s#    
 ##E*!!%(r$   c                     | j                   r:| j                   j                  d      }| j                  |       | j                   r9yy)zFlush keyboard event queuer   N)r{   popr   )r/   
past_events     r"   __flush_eventqueuez InternalShell.__flush_eventqueuer  s4    oo,,Q/J%%j1 oor$   c                 P   | j                   r| j                  j                          y| j                  j                  rb| j	                  d       d| j                  _        | j                  | j                  j                         | j                  j                          yd| _        y)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$$  !89(-  % 0 0 3 34  ,,.#' r$   c                    |j                         D ]l  }|j                         }|j                  d      r%| j                  |t        j
                  z   d       | j                  |dz          | j                          n y)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  sk    
 $$& 	D JJLM'',JJtBJJdJ3  d+JJL	r$   c                     | j                   r| j                  |       y|j                  d      r|dd }|dk(  r| j                          y| j	                  |       y)z[
        Execute a command
        cmd: one-line command only, with '
' at the end
        Nr   cls)rv   rh   endswithr   r   rf   s     r"   r   zInternalShell.execute_command  sU    
 ??NN3<<cr(C%<!r$   c                    |sd}n|r| j                  |       | j                  sd|vrf| j                  j                  j	                  t        |dz                | j                  j                          | j                  j                          y| j	                  t        d      d       y| j                  j                  j	                  t        |dz                y)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    C##C(!!c!  ,,220@t0LN  ))+""'')

1 M N "&  '
 ((../?d
/KLr$   c                 8    | j                   j                  |      S )zIs text a valid object?)r~   eval)r/   r   s     r"   _evalzInternalShell._eval  s    $$T**r$   c                 F    | j                  |      \  }}|rt        |      S y)zReturn dir(object)N)r   r   r/   objtxtobjvalids       r"   get_dirzInternalShell.get_dir  &    ZZ'
US>! r$   c                 \    t        | j                  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66r$   c                 <    t        j                  t                     S )z'Return shell current directory list dir)r   listdirr   r.   s    r"   get_cdlistdirzInternalShell.get_cdlistdir  s    zz.*++r$   c                 F    | j                  |      \  }}|rt        |      S y)zIs object callable?N)r   callabler   s       r"   
iscallablezInternalShell.iscallable  s&    ZZ'
UC=  r$   c                 F    | j                  |      \  }}|rt        |      S y)zGet func/method argument listN)r   r	   r   s       r"   get_arglistzInternalShell.get_arglist  r  r$   c                 H    | j                  |      \  }}|r|j                  S y)zGet object __doc__N)r   rE   r   s       r"   
get__doc__zInternalShell.get__doc__  s&    ZZ'
U;; r$   c                 F    | j                  |      \  }}|rt        |      S y)z#Get object documentation dictionaryN)r   r
   r   s       r"   get_doczInternalShell.get_doc  s&    ZZ'
U#; r$   c                 F    | j                  |      \  }}|rt        |      S y)zGet object sourceN)r   r   r   s       r"   
get_sourcezInternalShell.get_source  r  r$   c                 :    | j                   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
 HM !'s !'s "R #dE#"0J  D(0#5. 
V: :,5"
8*$_")2( M.+"7,!""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+     s    >  	   : 9 &8 8   % @ = ) ! = 0 B F =  >	f 	&'' &'RjA% jAr$   