ó
j·Ã^c           @@  s  d  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 m Z d d l	 m
 Z
 d d l m Z d d l m Z m Z d d l m Z e j e ƒ Z d	 e j f d
 „  ƒ  YZ d e f d „  ƒ  YZ d e j f d „  ƒ  YZ d e f d „  ƒ  YZ d „  Z d S(   s   Base option parser setupi    (   t   absolute_importN(   t	   strtobool(   t   string_types(   t   UNKNOWN_ERROR(   t   Configurationt   ConfigurationError(   t   get_terminal_sizet   PrettyHelpFormatterc           B@  s\   e  Z d  Z d „  Z d „  Z d d d „ Z d „  Z d „  Z d „  Z d	 „  Z	 d
 „  Z
 RS(   s4   A prettier/less verbose help formatter for optparse.c         O@  sC   d | d <d | d <t  ƒ  d d | d <t j j |  | | Ž d  S(   Ni   t   max_help_positioni   t   indent_incrementi    i   t   width(   R   t   optparset   IndentedHelpFormattert   __init__(   t   selft   argst   kwargs(    (    s)   site-packages/pip/_internal/cli/parser.pyR      s    

c         C@  s   |  j  | ƒ S(   N(   t   _format_option_strings(   R   t   option(    (    s)   site-packages/pip/_internal/cli/parser.pyt   format_option_strings!   s    s    <{}>s   , c         C@  s»   g  } | j  r& | j | j  d ƒ n  | j rF | j | j d ƒ n  t | ƒ d k rk | j d | ƒ n  | j ƒ  r® | j pŒ | j j ƒ  } | j | j	 | j ƒ  ƒ ƒ n  d j
 | ƒ S(   sð   
        Return a comma-separated list of option strings and metavars.

        :param option:  tuple of (short opt, long opt), e.g: ('-f', '--format')
        :param mvarfmt: metavar format string
        :param optsep:  separator
        i    i   t    (   t   _short_optst   appendt
   _long_optst   lent   insertt   takes_valuet   metavart   destt   lowert   formatt   join(   R   R   t   mvarfmtt   optsept   optsR   (    (    s)   site-packages/pip/_internal/cli/parser.pyR   $   s    		c         C@  s   | d k r d S| d S(   Nt   OptionsR   s   :
(    (   R   t   heading(    (    s)   site-packages/pip/_internal/cli/parser.pyt   format_heading;   s    c         C@  s(   d j  |  j t j | ƒ d ƒ ƒ } | S(   sz   
        Ensure there is only one newline between usage and the first heading
        if there is no description.
        s   
Usage: {}
s     (   R   t   indent_linest   textwrapt   dedent(   R   t   usaget   msg(    (    s)   site-packages/pip/_internal/cli/parser.pyt   format_usage@   s    c         C@  s{   | rs t  |  j d ƒ r! d } n d } | j d ƒ } | j ƒ  } |  j t j | ƒ d ƒ } d j | | ƒ } | Sd Sd  S(   Nt   maint   Commandst   Descriptions   
s     s   {}:
{}
R   (   t   hasattrt   parsert   lstript   rstripR&   R'   R(   R   (   R   t   descriptiont   label(    (    s)   site-packages/pip/_internal/cli/parser.pyt   format_descriptionI   s    	c         C@  s   | r
 | Sd Sd  S(   NR   (    (   R   t   epilog(    (    s)   site-packages/pip/_internal/cli/parser.pyt   format_epilog[   s    c         C@  s3   g  | j  d ƒ D] } | | ^ q } d j | ƒ S(   Ns   
(   t   splitR   (   R   t   textt   indentt   linet	   new_lines(    (    s)   site-packages/pip/_internal/cli/parser.pyR&   b   s    &(   t   __name__t
   __module__t   __doc__R   R   R   R%   R+   R5   R7   R&   (    (    (    s)   site-packages/pip/_internal/cli/parser.pyR      s   							t   UpdatingDefaultsHelpFormatterc           B@  s   e  Z d  Z d „  Z RS(   s®   Custom help formatter for use in ConfigOptionParser.

    This is updates the defaults before expanding them, allowing
    them to show up correctly in the help listing.
    c         C@  s;   |  j  d  k	 r( |  j  j |  j  j ƒ n  t j j |  | ƒ S(   N(   R0   t   Nonet   _update_defaultst   defaultsR   R   t   expand_default(   R   R   (    (    s)   site-packages/pip/_internal/cli/parser.pyRD   n   s    (   R=   R>   R?   RD   (    (    (    s)   site-packages/pip/_internal/cli/parser.pyR@   g   s   t   CustomOptionParserc           B@  s    e  Z d  „  Z e d „  ƒ Z RS(   c         O@  s6   |  j  | | Ž  } |  j j ƒ  |  j j | | ƒ | S(   s*   Insert an OptionGroup at a given position.(   t   add_option_groupt   option_groupst   popR   (   R   t   idxR   R   t   group(    (    s)   site-packages/pip/_internal/cli/parser.pyt   insert_option_groupv   s    c         C@  s2   |  j  } x! |  j D] } | j | j  ƒ q W| S(   s<   Get a list of all options, including those in option groups.(   t   option_listRG   t   extend(   R   t   rest   i(    (    s)   site-packages/pip/_internal/cli/parser.pyt   option_list_all   s    
(   R=   R>   RK   t   propertyRP   (    (    (    s)   site-packages/pip/_internal/cli/parser.pyRE   t   s   		t   ConfigOptionParserc           B@  sD   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   ss   Custom option parser which updates its defaults by checking the
    configuration files and environmental variablesc         O@  s\   | j  d ƒ |  _ | j  d t ƒ } t | ƒ |  _ |  j sB t ‚ t j j |  | | Ž d  S(   Nt   namet   isolated(	   RH   RS   t   FalseR   t   configt   AssertionErrorR   t   OptionParserR   (   R   R   R   RT   (    (    s)   site-packages/pip/_internal/cli/parser.pyR      s
    c         C@  sL   y | j  | | ƒ SWn1 t j k
 rG } d j | ƒ GHt j d ƒ n Xd  S(   Ns*   An error occurred during configuration: {}i   (   t   check_valueR   t   OptionValueErrorR   t   syst   exit(   R   R   t   keyt   valt   exc(    (    s)   site-packages/pip/_internal/cli/parser.pyt   check_default–   s
    c         c@  s×   d |  j  d g } d „  | Dƒ } xw |  j j ƒ  D]f \ } } | sZ t j d | ƒ q2 n  | j d d ƒ \ } } | | k r2 | | j | | f ƒ q2 q2 Wx4 | D], } x# | | D] \ } } | | f Vq´ Wq£ Wd  S(   Nt   globals   :env:c         S@  s   i  |  ] } g  | “ q S(    (    (   t   .0RS   (    (    s)   site-packages/pip/_internal/cli/parser.pys
   <dictcomp>¢   s   	 s7   Ignoring configuration key '%s' as it's value is empty.t   .i   (   RS   RV   t   itemst   loggert   debugR8   R   (   R   t   override_ordert   section_itemst   section_keyR^   t   sectionR]   (    (    s)   site-packages/pip/_internal/cli/parser.pyt    _get_ordered_configuration_items   s    c         C@  sÎ  t  j |  j ƒ |  _ t ƒ  } xy|  j ƒ  D]k\ } } |  j d | ƒ } | d k r\ q+ n  | j d k r´ y t	 | ƒ } Wq‰t
 k
 r° t | j | | ƒ } |  j | ƒ q‰XnÕ | j d k rú | j ƒ  } g  | D] } |  j | | | ƒ ^ qÖ } n | j d k rt| j | j ƒ | j ƒ  } | j | | ƒ } | j pCd	 }	 | j pRi  }
 | j | | | |  |	 |
 Ž n |  j | | | ƒ } | | | j <q+ Wx$ | D] } t |  j | ƒ | | <q¡Wd |  _ | S(
   s¢   Updates the given defaults with values from the config files and
        the environ. Does a little special handling for certain types of
        options (lists).s   --t
   store_truet   store_falset   countR   t   callbackN(   Rl   Rm   Rn   (    (   R   t   ValuesRC   t   valuest   setRk   t
   get_optionRA   t   actionR   t
   ValueErrort   invalid_config_error_messaget   errorR8   R`   t   addR   t   get_opt_stringt   convert_valuet   callback_argst   callback_kwargsRo   t   getattr(   R   RC   t	   late_evalR]   R^   R   t	   error_msgt   vt   opt_strR   R   (    (    s)   site-packages/pip/_internal/cli/parser.pyRB   µ   s:    	+	c         C@  sÛ   |  j  s t j |  j ƒ Sy |  j j ƒ  Wn) t k
 rU } |  j t t	 | ƒ ƒ n X|  j
 |  j j ƒ  ƒ } x] |  j ƒ  D]O } | j | j ƒ } t | t ƒ r{ | j ƒ  } | j | | ƒ | | j <q{ q{ Wt j | ƒ S(   s‹   Overriding to make updating the defaults after instantiation of
        the option parser possible, _update_defaults() does the dirty work.(   t   process_default_valuesR   Rp   RC   RV   t   loadR   R\   R   t   strRB   t   copyt   _get_all_optionst   getR   t
   isinstanceR   Ry   RY   (   R   t   errRC   R   t   defaultR   (    (    s)   site-packages/pip/_internal/cli/parser.pyt   get_default_valuesæ   s    	 c         C@  s-   |  j  t j ƒ |  j t d j | ƒ ƒ d  S(   Ns   {}
(   t   print_usageR[   t   stderrR\   R   R   (   R   R*   (    (    s)   site-packages/pip/_internal/cli/parser.pyRw   û   s    (	   R=   R>   R?   R   R`   Rk   RB   R‹   Rw   (    (    (    s)   site-packages/pip/_internal/cli/parser.pyRR   ‰   s   					1	c         C@  s,   |  d k r d j  | | ƒ Sd j  | | ƒ S(   sQ   Returns a better error message when invalid configuration option
    is provided.Rl   Rm   so   {0} is not a valid value for {1} option, please specify a boolean value like yes/no, true/false or 1/0 instead.s[   {0} is not a valid value for {1} option, please specify a numerical value like 1/0 instead.(   Rl   Rm   (   R   (   Rt   R]   R^   (    (    s)   site-packages/pip/_internal/cli/parser.pyRv      s
    
(   R?   t
   __future__R    t   loggingR   R[   R'   t   distutils.utilR   t   pip._vendor.sixR   t   pip._internal.cli.status_codesR   t   pip._internal.configurationR   R   t   pip._internal.utils.compatR   t	   getLoggerR=   Re   R   R   R@   RX   RE   RR   Rv   (    (    (    s)   site-packages/pip/_internal/cli/parser.pyt   <module>   s    Pw