U
    adkY                     @   s   d dl Z d dlZd dlZd dlZd dl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 d	d
 ZdddZG dd de
ZdS )    N)connections)settings)BaseCommandCommandError)
OrderedSet)import_objects)signalcommand)monkey_patch_cursordebugwrapperc                  C   s4   t jd} | sdS t j| } | dp2| dS )NZEDITORFviZvim)osenvirongetpathbasename
startswithendswith)Zeditor r   T/tmp/pip-unpacked-wheel-portabvm/django_extensions/management/commands/shell_plus.pyuse_vi_mode   s
    r   c                    s    fdd}|S )ae  
    Decorates methods with information about the application they are starting

    :param flags: The flags used to start this runner via the ArgumentParser.
    :param name: The name of this runner for the help text for the ArgumentParser.
    :param help: The optional help for the ArgumentParser if the dynamically generated help is not sufficient.
    c                    s    | _ | _| _| S N)runner_flagsrunner_namerunner_help)fnflagshelpnamer   r   	decorator#   s    zshell_runner.<locals>.decoratorr   )r   r   r   r   r   r   r   shell_runner   s    	r   c                       sL  e Zd ZdZdZdZ fddZ fddZ fdd	Zd
d Z	dd Z
dd Zedgdddd Zdd Zdd Zd@ddZedgdddd Zed gd!dd"d# Zed$gd%dd&d' Zed(gd)dd*d+ Zed,gd-dd.d/ Zed0gd1dd2d3 Zed4gd5dd6d7 Zed8gd9dd:d; Zd<d= Zed>d? Z  ZS )ACommandzOLike the 'shell' command but autoloads the models of all installed Django apps.NFc                    s$   t    dd t| D | _d S )Nc                 S   s   g | ]\}}t |d r|qS )r   )hasattr).0r   memberr   r   r   
<listcomp>4   s    
z$Command.__init__.<locals>.<listcomp>)super__init__inspect
getmembersrunnersself	__class__r   r   r&   2   s    
zCommand.__init__c                    s&  t  | | }| jD ]4}|jr,|j}n
d|j }|j|jdd||d q|jddddd	 |jd
ddddd |jdddddd |jddddd |jddtdd |jddddd |jdddg dd |jdddd d!d" |jd#dt	 d$d%d" |jd&ddd'd(d" |jd)d*d+d, d S )-NzTells Django to use %s.store_construnner)actiondestconstr   z--connection-filestoreconnection_filezASpecifies the connection file to use if using the --kernel option)r0   r1   r   z--no-startup
store_true
no_startupFzaWhen using plain Python, ignore the PYTHONSTARTUP environment variable and ~/.pythonrc.py script.)r0   r1   defaultr   z--use-pythonrcuse_pythonrcz_When using plain Python, load the PYTHONSTARTUP environment variable and ~/.pythonrc.py script.z--print-sqlz%Print SQL queries as they're executed)r0   r7   r   z--truncate-sqlz/Truncate SQL queries to a number of characters.)r0   typer   z--print-sql-locationz4Show location in code where SQL query generated fromz--dont-loadappendZ	dont_loadzBIgnore autoloading of some apps/models. Can be used several times.z--quiet-loadZ
quiet_loadz%Do not display loaded models messages)r0   r7   r1   r   z--vivi_modez5Load Vi key bindings (for --ptpython and --ptipython)--no-browser
no_browserz3Don't open the notebook in a browser after startup.-cz	--commandzJInstead of opening an interactive shell, run a command as Django and exit.)r   )
r%   add_argumentsadd_mutually_exclusive_groupr)   r   r   add_argumentr   intr   )r+   parsergroupr/   r   r,   r   r   r?   7   s    

    
                    zCommand.add_argumentsc                    sD   d|dd  kr8| d}||d d  | _|d | }t |S )N--      )index
extra_argsr%   run_from_argv)r+   argvidxr,   r   r   rJ   x   s
    
zCommand.run_from_argvc                 C   s*   d}t t|g }|s&tj|d }|S )NZIPYTHON_ARGUMENTS getattrr   r   r   r   split)r+   optionsZipython_args	argumentsr   r   r   get_ipython_arguments   s
    zCommand.get_ipython_argumentsc                 C   s*   d}t t|g }|s&tj|d }|S )NZNOTEBOOK_ARGUMENTSrM   rN   )r+   rQ   Znotebook_argsrR   r   r   r   get_notebook_arguments   s
    zCommand.get_notebook_argumentsc                 C   s   t || j}| jr|| _|S r   )r   style
tests_modeZtests_imported_objects)r+   rQ   imported_objectsr   r   r   get_imported_objects   s    zCommand.get_imported_objectsz--kernelzIPython Kernel)r   r   c                    sr   z@ddl m} |jd dk r2tjd W d S ddl m W n tk
r\   t	  Y S X  fdd}|S )Nr   releaserF   z.--kernel requires at least IPython version 2.0)start_kernelc                     s8     } tg | d} d }|r*||d< f | d S )NrK   user_nsr4   )rX   dict)rW   kwargsr4   rQ   r+   r[   r   r   
run_kernel   s    
z&Command.get_kernel.<locals>.run_kernel)
IPythonrZ   version_infoprintrU   ERRORr[   ImportError	traceback
format_exc)r+   rQ   rZ   ra   r   r`   r   
get_kernel   s    
zCommand.get_kernelc              	   C   sv   |j }ttdddg}t|tr&|g}d}|D ]2}z||}W  qbW q. tk
r^   Y q.Y q.X q.|srtd| |S )z<Finds and returns the base Python kernelspec to extend from.ZNOTEBOOK_KERNEL_SPEC_NAMESpython3pythonNz1No notebook (Python) kernel specs found. Tried %r)kernel_spec_managerrO   r   
isinstancestrZget_kernel_spec	Exceptionr   )r+   appksmZtry_spec_namesksZ	spec_namer   r   r   load_base_kernel_spec   s"    


zCommand.load_base_kernel_specc                 C   s   |  |}|j| ttdd|_tjtj	t
jd \}}|dkrtj|r|jdtjdd}|tj}||kr|| tjtd||jd< d|iS )	zBGenerate an IPython >= 3.0 kernelspec that loads django extensionsZIPYTHON_KERNEL_DISPLAY_NAMEzDjango Shell-Plusr   z	manage.py
PYTHONPATHrM   NZdjango_extensions)rs   rK   extendrO   r   Zdisplay_namer   r   rP   realpathsysisdirenvr   r   pathsepr:   joinfilter)r+   rp   ipython_argumentsrr   Zmanage_py_dirZ	manage_py
pythonpathr   r   r   generate_kernel_specs   s    

zCommand.generate_kernel_specsTc                 C   s  |d }| j rRd| j krF| j d}| j d | }| j |d d  }qf| j }g }n| |}| |}d|kr||ddg |rd|kr|d d|krtdd	 |D s|dd
g |s|| |stdd	 |D s|d t|s|}	t	dt
 |	| n||}	|r|	j}
| |	| D ]\}}tj|j|
jg}|D ]}tj||}zRtj|s~t| ttj|dd}||  W 5 Q R X W  q2W n tk
r   Y qRY nX qRtd||f q2|	  d S )Nr=   rE   rG   z/django_extensions.management.notebook_extensionz--extr<   z--notebook-dirc                 s   s   | ]}| d V  qdS )z--notebook-dir=Nr   )r"   er   r   r   	<genexpr>   s     z*Command.run_notebookapp.<locals>.<genexpr>.c                 s   s   | ]}| d V  qdS )z--HistoryManagerNr   )r"   argr   r   r   r      s     z--HistoryManager.enabled=Falsez3Initialize should be a callable not an app instancezkernel.jsonwz+Could not write kernel %r in directories %r)rI   rH   rT   rS   ru   r:   anycallablewarningswarnDeprecationWarning
initializerl   r   itemsr   r   dirnameresource_dirZuser_kernel_dirr{   existsmakedirsopenwriteZto_jsonOSErrorr   start)r+   app_initrQ   use_kernel_specshistoryr=   rL   Znotebook_argumentsr}   rp   rq   Zkidrr   rootsrootZ
kernel_dirfr   r   r   run_notebookapp   sR    







zCommand.run_notebookappz
--notebookzIPython Notebookc                    s  zddl m} W n tk
r,   t  Y S X zddlm  W n tk
r   |jd dkrht  Y S zddlm  W nn tk
r   |jd dkrt  Y  Y S zddl	m
} |j W n$ tk
r   t  Y  Y  Y S X Y nX Y nX |jd dk fddfd	d
}|S )Nr   rY   NotebookApp      )notebookappc                     s      }|j| | |S r   instancer   argsr_   rp   r   r   r   r   *  s    z&Command.get_notebook.<locals>.app_initc                      s      d S r   r   r   )r   rQ   r+   r   r   r   run_notebook/  s    z*Command.get_notebook.<locals>.run_notebook)rb   rZ   rf   rg   rh   notebook.notebookappr   rc   ZIPython.html.notebookappZIPython.frontend.html.notebookr   )r+   rQ   rZ   r   r   r   )r   r   rQ   r+   r   r   get_notebook  s.    
"zCommand.get_notebookz--labzJupyterLab Notebookc                    s   zddl m  W n tk
r,   t  Y S X zddlm} W n tk
rV   d }Y nX |rft |sn jn fddfdd}|S )Nr   LabAppr   c                     s      }|j| | |S r   r   r   r   r   r   r   C  s    z(Command.get_jupyterlab.<locals>.app_initc                      s   j  dd d S )NF)r   r   r   )r   rQ   r+   r   r   run_jupyterlabH  s    z.Command.get_jupyterlab.<locals>.run_jupyterlab)	Zjupyterlab.labappr   rf   rg   rh   r   r   
issubclassZinitialize_server)r+   rQ   r   r   r   )r   r   rQ   r+   r   get_jupyterlab3  s    
zCommand.get_jupyterlabz--plainzplain Pythonc              
      s>  dd l  | |zdd l}W n tk
r2   Y nNX dd l}||j t|dd}|d k	rvd|krv|	d n
|	d |d }|d }|s|s,t
tjd	tjd
gD ]t}|sqtj|sqt|}| }	W 5 Q R X ztt|	|d W q tk
r(   t  | jr$ Y qX q fdd}
|
S )Nr   __doc__rM   libeditzbind ^I rl_completeztab:completer8   r6   ZPYTHONSTARTUPz~/.pythonrc.pyexecc                      s    j d d S )N)local)Zinteractr   coderW   r   r   	run_plainy  s    z$Command.get_plain.<locals>.run_plain)r   rX   readlinerf   rlcompleterZset_completerZ	CompleterZcompleterO   parse_and_bindr   r   r   r   r   
expanduserisfiler   readr   compilero   rg   	print_excrV   )r+   rQ   r   r   readline_docr8   r6   ZpythonrchandleZpythonrc_coder   r   r   r   	get_plainL  s<    


 

zCommand.get_plainz	--bpythonZBPythonc                    sB   zddl m  W n tk
r,   t  Y S X  fdd}|S )Nr   embedc                     s.    } i }jrj|d<  | f| d S )Nr   )rX   rI   )rW   r_   r   rQ   r+   r   r   run_bpython  s
    

z(Command.get_bpython.<locals>.run_bpython)bpythonr   rf   rg   rh   )r+   rQ   r   r   r   r   get_bpython}  s    zCommand.get_bpythonz	--ipythonrb   c                    s   z"ddl m fdd}|W S  tk
r   t }zddlm  W n( tk
rr   |d t   Y  Y S X  fdd}| Y S X d S )Nr   )start_ipythonc                     s*     } jp }|| d d S Nr\   )rX   rI   rS   )rW   r}   )rQ   r+   r   r   r   run_ipython  s    
z(Command.get_ipython.<locals>.run_ipython)IPShell
c                     s"    }  g | d}|  d S r   )rX   Zmainloop)rW   shell)r   rQ   r+   r   r   r     s    
)rb   r   rf   rg   rh   ZIPython.Shellr   )r+   rQ   r   Zstr_excr   )r   rQ   r+   r   r   get_ipython  s    zCommand.get_ipythonz
--ptpythonZPTPythonc                    sz   zddl m m W nN tk
rb   t }zddlm m W n tk
r\   | Y  Y S X Y nX  fdd}|S )Nr   )r   
run_configc                     s.    } tjd} | |d d d S )N~/.ptpython_historyr;   )globalshistory_filenamer;   	configurerX   r   r   r   rW   r   r   rQ   r   r+   r   r   run_ptpython  s    
 z*Command.get_ptpython.<locals>.run_ptpython)ptpython.replr   r   rf   rg   rh   prompt_toolkit.contrib.repl)r+   rQ   tbr   r   r   r   get_ptpython  s    zCommand.get_ptpythonz--ptipythonz
PT-IPythonc                    s   zddl m ddlm  W nV tk
rr   t }zddlm ddlm  W n tk
rl   | Y  Y S X Y nX  fdd}|S )Nr   )r   r   c                     s.    } tjd} | |d d d S )Nr   r;   )r]   r   r;   r   r   r   r   r   r   run_ptipython  s    
 z,Command.get_ptipython.<locals>.run_ptipython)	r   r   Zptpython.ipythonr   rf   rg   rh   r   Zprompt_toolkit.contrib.ipython)r+   rQ   r   r   r   r   r   get_ptipython  s    zCommand.get_ptipythonz--idleIdlec                    s   ddl m   fdd}|S )Nr   mainc                      s   t jd ddgt _   d S )Nr   r>   z
from django_extensions.management import shells
from django.core.management.color import no_style
for k, m in shells.import_objects({}, no_style()).items():
    globals()[k] = m
)rw   rK   r   r   r   r   run_idle  s
    
z"Command.get_idle.<locals>.run_idle)Zidlelib.pyshellr   )r+   rQ   r   r   r   r   get_idle  s    zCommand.get_idlec                    s   d d}d}t tdg }t D ]b}|j}t|j}t fdd|D r d|| ksh||| d kr || 	di 
||i q dS )	a  
        Set the application_name on PostgreSQL connection

        Use the fallback_application_name to let the user override
        it with PGAPPNAME env variable

        http://www.postgresql.org/docs/9.4/static/libpq-connect.html#LIBPQ-PARAMKEYWORDS  # noqa
        )zdjango.db.backends.postgresqlz&django.db.backends.postgresql_psycopg2Zfallback_application_nameZdjango_shellZ	DATABASESc                 3   s   | ]}|j  V  qd S r   )
__module__r   )r"   klassZsupported_backendsr   r   r     s     z/Command.set_application_name.<locals>.<genexpr>OPTIONSN)rO   r   r   allaliasr'   getmror-   r   
setdefaultupdate)r+   rQ   opt_nameZdefault_app_nameZdbs
connectionr   mror   r   r   set_application_name  s    	zCommand.set_application_namec              	      s   d  d }t tdd}d }d } d dkr4d n d }t d pH|| d d	d
n t td	d }fdd}	  |s|r|	d| }|sd }|}|r| }|j}n fdd}
t }dddddg}|D ]2}|	d| }|| |
|}|r|j} qq|sFjD ]*}||kr|
|}|r|j} qFqt|sx|r^t	| |slt
dt
d| jrW 5 Q R  dS  d r }t d | W 5 Q R  d S |  W 5 Q R X d S )N	verbosityr/   ZSHELL_PLUS_PRINT_SQLFZtruncate_sqlr   	print_sqlprint_sql_locationZ
SHELL_PLUS)r   truncater   Z
confprefixc                    s"    j D ]}| |jkr|  S qd S r   )r)   r   )flagr/   r*   r   r   get_runner_by_flag  s    


z*Command.handle.<locals>.get_runner_by_flagz--%sc                    sV   | j }dkr"tjd|  |  }t|rRdkrNtjd|  |S d S )NrF   z
Trying: %srG   z	Using: %s)r   rd   rU   ZNOTICEr   )
get_runnerr   r/   rQ   r+   r   r   r   
try_runner  s    z"Command.handle.<locals>.try_runnerZ	ptipythonZptpythonr   ZipythonplainzNo shell runner could be found.z"Could not load shell runner: '%s'.   command)rO   r   r	   r   r   setaddr)   r   rd   r   rV   rX   r   )r+   r   rQ   r   r   r/   r   r   ZSETTINGS_SHELL_PLUSr   r   Ztried_runnersZpreferred_runnersZflag_suffixrW   r   r   r   r     s`     







zCommand.handle)TT)__name__r   __qualname__r   rI   rV   r&   r?   rJ   rS   rT   rX   r   ri   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   r,   r   r    -   sB   A

?
 

0




r    )N)r'   r   rw   rg   r   Z	django.dbr   Zdjango.confr   Zdjango.core.management.baser   r   Zdjango.utils.datastructuresr   Z#django_extensions.management.shellsr   Z"django_extensions.management.utilsr   Z)django_extensions.management.debug_cursorr	   r   r   r    r   r   r   r   <module>   s   
