U
    d"                     @   s  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	Z	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mZ zd dlZ	dZW n  ek
r   d dlZ	d	ZY nX zd d
lmZ W n$ ek
r   G dd deZY nX ejd  dkZereZneZdZe  Z!d,ddZ"d-ddZ#dd Z$dd Z%e"dddge$d e"dddge%d G dd  d eZ&d!d" Z'd.d#d$Z(d/d%d&Z)d'd Z*d(d) Z+d*d+ Z,dS )0    )defaultdict)	Completer
Completion)InMemoryHistorypromptN   )InternalCommandExceptionExitReplExceptionTF)Exitc                   @   s   e Zd ZdS )	ClickExitN)__name__
__module____qualname__ r   r   7/tmp/pip-unpacked-wheel-p4w9d32w/click_repl/__init__.pyr      s   r      z0.2.0c                 C   sV   t |dstdt| tjr&| g} nt| ttfs<td| D ]}||ft|< q@d S )N__call__z#Internal command must be a callablez*"names" must be a string or a list / tuple)hasattr
ValueError
isinstancesixstring_typeslisttuple_internal_commands)namestargetdescriptionnamer   r   r   _register_internal_command)   s    
r    c                 C   s   t | }|r|d S |S )Nr   )r   get)r   defaulttarget_infor   r   r   _get_registered_target6   s    
r$   c                   C   s
   t  d S N)r
   r   r   r   r   _exit_internal=   s    r&   c               	   C   s   t  } | d |   | d | d W 5 Q R X | dX | d tt}t	t
D ]\}}||d  | qb| dd t	|D  W 5 Q R X |  S )	Nz	REPL helpzExternal Commandsz!prefix external commands with "!"zInternal Commandsz!prefix internal commands with ":"r   c                 s   s.   | ]&\}}d  dd t|D |fV  qdS )z, c                 s   s   | ]}d  |V  qdS )z:{0}N)format).0mnemonicr   r   r   	<genexpr>N   s     z+_help_internal.<locals>.<genexpr>.<genexpr>N)joinsorted)r(   r   Z	mnemonicsr   r   r   r*   L   s   z!_help_internal.<locals>.<genexpr>)clickHelpFormatterZwrite_headingindentsection
write_textr   r   r   	iteritemsr   appendZwrite_dlgetvalue)	formatterZ
info_tabler)   r#   r   r   r   _help_internalA   s    


r6   qquitexitzexits the repl?hhelpz!displays general help informationc                   @   s   e Zd Zdd ZdddZdS )ClickCompleterc                 C   s
   || _ d S r%   )cli)selfr>   r   r   r   __init__]   s    zClickCompleter.__init__Nc              
   c   s  zt |j}W n tk
r&   Y d S X |j |jk}|rJ|rJ| }nd}trhtj	| j
i d|}ntj| j
d|}|d krd S g }|jjD ]}t|tjr|j|jfD ].}	|	D ]$}
|tt|
t| |jd qqqt|tjrt|jtjr|jjD ] }|tt|t|  qqt|jtjr||j|D ]8}|j||}|tt|t| t|dd qB|D ]}|j !|r|V  qd S )N )Zdisplay_metaZ
short_help)"shlexsplitZtext_before_cursorr   rstrippopHAS_C8r-   Zshell_completionZ_resolve_contextr>   Z_bashcompleteZresolve_ctxcommandparamsr   OptionoptsZsecondary_optsr3   r   	text_typelenr<   ZArgumenttypeZChoicechoicesZMultiCommandZlist_commandsget_commandgetattrtext
startswith)r?   documentZcomplete_eventargsZcursor_within_command
incompletectxrN   paramoptionsochoicer   rG   itemr   r   r   get_completions`   sV    
  
 zClickCompleter.get_completions)N)r   r   r   r@   r\   r   r   r   r   r=   \   s   r=   c                 C   s@   | pi } t  t|dd}|D ]}|| }|| kr|| |< q| S )z
    Bootstrap prompt_toolkit kwargs or use user defined values.

    :param prompt_kwargs: The user specified prompt kwargs.
    z> )historyZ	completermessage)r   r=   )prompt_kwargsgroupdefaultskeydefault_valuer   r   r   bootstrap_prompt   s    
rd   c              
      s   | j p| }|j}tj }| jj}t|jtjrDdd |jj	D }n|jj
}||d t | |rt fdd}	ntjj}	z
|	 }
W n0 tk
r   Y q|Y n tk
r   Y qY nX |
s|rq|nq|rt|
rq||r"z(t|
}t|tjrt| W q|W n tk
r    Y qY nX zt|
}W nD tk
rt } z$tdt|j| W Y q|W 5 d}~X Y nX z2|jd||d}|| |  W 5 Q R X W q| tjk
r } z|   W 5 d}~X Y q| t!k
r   Y q| t"k
r   Y q| tk
r   Y qY q|X q|dS )a<  
    Start an interactive shell. All subcommands are available in it.

    :param old_ctx: The current Click context.
    :param prompt_kwargs: Parameters passed to
        :py:func:`prompt_toolkit.shortcuts.prompt`.

    If stdin is not a TTY, no prompt will be printed, but only commands read
    from stdin.

    c                 S   s&   i | ]}|j  D ]\}}||qqS r   )commandsitems)r(   sourcecmd_namecmd_objr   r   r   
<dictcomp>   s
     zrepl.<locals>.<dictcomp>Nc                      s
   t f  S r%   r   r   r_   r   r   rO      s    zrepl.<locals>.get_commandz{}: {})parent)#rl   rG   sysstdinisattyr   r   r-   ZCommandCollectionsourcesre   rE   rd   readlineKeyboardInterruptEOFErrordispatch_repl_commandshandle_internal_commandsr   r   Zechor
   rB   rC   r   r'   rM   r   Zmake_contextZinvoker9   ZClickExceptionshowr   
SystemExit)Zold_ctxr_   Zallow_system_commandsZallow_internal_commandsZ	group_ctxr`   ro   Zrepl_command_nameZavailable_commandsrO   rG   resultrT   erV   r   rk   r   repl   sf    





rz   c                 C   s   | j |dtt dS )z9Register :func:`repl()` as sub-command *name* of *group*.)r   N)rG   r-   Zpass_contextrz   )r`   r   r   r   r   register_repl  s    r{   c                   C   s
   t   dS )zExit the replN)r&   r   r   r   r   r9     s    c                 C   s$   |  dr t| dd  dS dS )zkExecute system commands entered in the repl.

    System commands are all commands starting with "!".

    !r   NTF)rR   ossystem)rG   r   r   r   rt     s    
rt   c                 C   s,   |  dr(t| dd dd}|r(| S dS )zaRun repl-internal commands.

    Repl-internal commands are all commands starting with ":".

    :r   N)r"   )rR   r$   )rG   r   r   r   r   ru   &  s    
ru   )N)N)NTT)rz   )-collectionsr   Zprompt_toolkit.completionr   r   Zprompt_toolkit.historyr   Zprompt_toolkit.shortcutsr   r-   Zclick.parserr}   rB   rm   r   
exceptionsr	   r
   Zclick.shell_completionrF   ImportErrorZclick._bashcompleteZclick.exceptionsr   r   RuntimeErrorversion_infoPY2unicoderK   str__version__dictr   r    r$   r&   r6   r=   rd   rz   r{   r9   rt   ru   r   r   r   r   <module>   s\   


  A   
\
