
0c@_                 @   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 r d 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 St  j d j   d d  }  t t  j d  } y |  | d   Wn t k
 ro d   Yn Xt   } t t  } g  } d } x! |  D] } | | k r | } Pq W| d k	 r| d k r t j	 d  | d k o   j
 d
  } | rg  }   j   }	 xR t d d  D]A }
 |
 j j
 |	  r|
 j |  d d  k r| j |
 j  qW| rx | D] }
 t |
  qpWt j	 d  t |  } xW | j j D]I } | j t j k rx. | j | j D] } | j | | j f  qWqWd d   |  d | d  D   f d d   | D }   f d d   | D } t |  | | j j  } | rt   |  } d d   | D } x$| D]H } | d } | d r| d d d  d k r| d 7} t |  qWn d d   | j D } | j | j  t j |  }   j
 d
  r^xd | D], } | j t j k r+| | j | j 7} q+Wn- t |  | |  } | rt t   |   } t d j   f d d   | D   t j	 d  d S)z?Entry Point for completion of main and subcommand options.
    PIP_AUTO_COMPLETEN
COMP_WORDS   
COMP_CWORD helpshow	uninstall-
local_onlyTc             S   s#   g  |  ] } | j  d   d  q S)=r   )split).0x r   ?/tmp/pip-build-jynh7p1z/pip/pip/_internal/cli/autocompletion.py
<listcomp>H   s   	 z autocomplete.<locals>.<listcomp>c                s.   g  |  ]$ \ } } |   k r | | f  q Sr   r   )r   r   v)	prev_optsr   r   r   I   s   	 c                s1   g  |  ]' \ } } | j     r | | f  q Sr   )
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 Sr   )option_list)r   ir   r   r   r   ^   s   	  c                s%   g  |  ] } | j     r |  q Sr   )r   )r   r   )r!   r   r   r   m   s   	 )zshowz	uninstall) 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cwordr2   subcommandsoptionssubcommand_namewordZshould_list_installed	installedlcdist
subcommandoptopt_strcompletion_typepathsoption	opt_labeloptsZflattened_optsr   )r!   r   r   autocomplete   s~    	+!
$
			&rO   c             C   s   | d k  s$ |  | d j  d  r( d Sx | D] } | j t j k rJ q/ xt t |  j d  D]] } |  | d j d  d | k r` | j s t d d   | j j d  D  r` | j Sq` Wq/ Wd 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dirN)zpathzfilezdirr   )r   r   r   r   r   	<genexpr>   s   z+get_path_completion_type.<locals>.<genexpr>)r   r   r4   r5   strr   metavarany)r>   r?   rN   rH   or   r   r   r9   q   s    	$!	r9   c             #   s  t  j j |   \ }   t  j j |  } t  j | t  j  sC d St  j j        f d d   t  j |  D } x | D] } t  j j | |  } t  j j t  j j | |   } | d k r t  j j	 |  r | Vq~ t  j j
 |  r~ t  j j | d  Vq~ Wd 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   s0   |  ]& } t  j j |  j    r | Vq d  S)N)r'   r"   normcaser   )r   r   )filenamer   r   rS      s    z&auto_complete_paths.<locals>.<genexpr>rR   r   )r'   r"   r   abspathaccessR_OKrX   listdirr=   isfileisdir)r!   rJ   	directoryZcurrent_path	file_listfrH   Z	comp_filer   )rY   r   r:      s    
"!r:   )__doc__r4   r'   r,   	itertoolsr   Zpip._internal.cli.main_parserr   Zpip._internal.commandsr   r   Zpip._internal.utils.miscr   Zpip._internal.utils.typingr   Ztypingr   r	   r
   r   rO   r9   r:   r   r   r   r   <module>   s   "_