U
    «ÃT_“  ã                   @   s”   d 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 erxddlmZmZmZmZ d	d
„ Zdd„ Zdd„ ZdS )zBLogic that powers autocompletion installed by ``pip completion``.
é    N)Úchain)Úcreate_main_parser)Úcommands_dictÚcreate_command)Úget_installed_distributions)ÚMYPY_CHECK_RUNNING)ÚAnyÚIterableÚListÚOptionalc                     sÐ  dt jkrdS t jd  ¡ dd… } tt jd ƒ}z| |d  ‰ W n tk
rZ   d‰ Y nX tƒ }ttƒ}g }d}| D ]}||krv|} qŒqv|dk	�r(|dkr¨t 	d¡ |dkoºˆ  
d	¡ }|�r,g }ˆ  ¡ }	td
d�D ].}
|
j 
|	¡rØ|
j| dd… krØ| |
j¡ qØ|�r,|D ]}
t|
ƒ �qt 	d¡ t|ƒ}|jjD ]8}|jtjk�r<|j|j D ]}| ||jf¡ �qZ�q<dd„ | d|d … D ƒ‰‡fdd„|D ƒ}‡ fdd„|D ƒ}t| ||jjƒ}|�râtˆ |ƒ}dd„ |D ƒ}|D ]>}|d }|d �r|d dd… dk�r|d7 }t|ƒ �qænšdd„ |jD ƒ}| |j¡ t |¡}ˆ  
d	¡�r†|D ]$}|jtjk�r^||j|j 7 }�q^n t| ||ƒ}|�r¦ttˆ |ƒƒ}td ‡ fdd„|D ƒ¡ƒ t 	d¡ dS )z?Entry Point for completion of main and subcommand options.
    ÚPIP_AUTO_COMPLETENÚ
COMP_WORDSé   Ú
COMP_CWORDÚ Úhelp)ÚshowÚ	uninstallú-T)Ú
local_onlyc                 S   s   g | ]}|  d ¡d ‘qS )ú=r   )Úsplit©Ú.0Úx© r   úD/tmp/pip-unpacked-wheel-8u7dkzi1/pip/_internal/cli/autocompletion.pyÚ
<listcomp>H   s     z autocomplete.<locals>.<listcomp>c                    s    g | ]\}}|ˆ kr||f‘qS r   r   )r   r   Úv)Ú	prev_optsr   r   r   I   s      c                    s"   g | ]\}}|  ˆ ¡r||f‘qS r   ©Ú
startswith)r   Úkr   ©Úcurrentr   r   r   K   s     
 c                 S   s   g | ]}|d f‘qS )r   r   )r   Úpathr   r   r   r   T   s     r   é   z--r   c                 S   s   g | ]
}|j ‘qS r   )Úoption_list)r   Úir   r   r   r   ^   s     ú c                    s   g | ]}|  ˆ ¡r|‘qS r   r    r   r#   r   r   r   m   s     
 ) ÚosÚenvironr   ÚintÚ
IndexErrorr   Úlistr   ÚsysÚexitr!   Úlowerr   ÚkeyÚappendÚprintr   ÚparserÚoption_list_allr   ÚoptparseÚSUPPRESS_HELPÚ
_long_optsÚ_short_optsÚnargsÚget_path_completion_typeÚauto_complete_pathsÚoption_groupsr'   r   Úfrom_iterableÚjoin)ÚcwordsÚcwordr5   ÚsubcommandsÚoptionsÚsubcommand_nameÚwordÚshould_list_installedÚ	installedÚlcÚdistÚ
subcommandÚoptÚopt_strÚcompletion_typeÚpathsÚoptionÚ	opt_labelÚoptsÚflattened_optsr   )r$   r   r   Úautocomplete   sŠ    




þ
  ÿ
 
ÿÿrT   c                 C   s–   |dk s| |d    d¡sdS |D ]n}|jtjkr4q"t|ƒ d¡D ]L}| |d   d¡d |krB|jr€tdd„ |j d¡D ƒƒrB|j    S qBq"dS )	aL  Get the type of path completion (``file``, ``dir``, ``path`` or None)

    :param cwords: same as the environmental variable ``COMP_WORDS``
    :param cword: same as the environmental variable ``COMP_CWORD``
    :param opts: The available options to check
    :return: path completion type (``file``, ``dir``, ``path`` or None)
    r&   r   Nú/r   r   c                 s   s   | ]}|d kV  qdS ))r%   ÚfileÚdirNr   r   r   r   r   Ú	<genexpr>�   s   ÿz+get_path_completion_type.<locals>.<genexpr>)r!   r   r7   r8   Ústrr   ÚmetavarÚany)rA   rB   rR   rL   Úor   r   r   r<   q   s    	
þr<   c                 #   s¼   t j | ¡\}‰ t j |¡}t  |t j¡s.dS t j ˆ ¡‰ ‡ fdd„t  |¡D ƒ}|D ]`}t j ||¡}t j t j ||¡¡}|dkršt j 	|¡rš|V  qVt j 
|¡rVt j |d¡V  qVdS )ao  If ``completion_type`` is ``file`` or ``path``, list all regular files
    and directories starting with ``current``; otherwise only list directories
    starting with ``current``.

    :param current: The word to be completed
    :param completion_type: path completion type(`file`, `path` or `dir`)i
    :return: A generator of regular files and/or directories
    Nc                 3   s$   | ]}t j |¡ ˆ ¡r|V  qd S )N)r*   r%   Únormcaser!   r   ©Úfilenamer   r   rX   ™   s    ÿz&auto_complete_paths.<locals>.<genexpr>rW   r   )r*   r%   r   ÚabspathÚaccessÚR_OKr]   Úlistdirr@   ÚisfileÚisdir)r$   rN   Ú	directoryÚcurrent_pathÚ	file_listÚfrL   Ú	comp_filer   r^   r   r=   ˆ   s    
r=   )Ú__doc__r7   r*   r/   Ú	itertoolsr   Úpip._internal.cli.main_parserr   Úpip._internal.commandsr   r   Úpip._internal.utils.miscr   Úpip._internal.utils.typingr   Útypingr   r	   r
   r   rT   r<   r=   r   r   r   r   Ú<module>   s   _