U
    «ÃT_%  ã                   @   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 e¡ZG d	d
„ d
ejƒZG dd„ deƒZG dd„ dejƒZG dd„ deƒZdd„ ZdS )zBase option parser setupé    )Úabsolute_importN)Ú	strtobool)Ústring_types)ÚUNKNOWN_ERROR)ÚConfigurationÚConfigurationError)Úget_terminal_sizec                   @   sR   e Zd ZdZdd„ Zdd„ Zddd	„Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚPrettyHelpFormatterz4A prettier/less verbose help formatter for optparse.c                 O   s:   d|d< d|d< t ƒ d d |d< tjj| f|ž|Ž d S )Né   Úmax_help_positioné   Úindent_incrementr   é   Úwidth)r   ÚoptparseÚIndentedHelpFormatterÚ__init__)ÚselfÚargsÚkwargs© r   ú</tmp/pip-unpacked-wheel-8u7dkzi1/pip/_internal/cli/parser.pyr      s    zPrettyHelpFormatter.__init__c                 C   s   |   |dd¡S )Nú <%s>ú, )Ú_format_option_strings©r   Úoptionr   r   r   Úformat_option_strings!   s    z)PrettyHelpFormatter.format_option_stringsr   r   c                 C   s|   g }|j r| |j d ¡ |jr0| |jd ¡ t|ƒdkrH| d|¡ | ¡ rr|jp^|j ¡ }| || ¡  ¡ d 	|¡S )a  
        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 - evaluated as mvarfmt % metavar
        :param optsep:  separator
        r   r   Ú )
Ú_short_optsÚappendÚ
_long_optsÚlenÚinsertÚtakes_valueÚmetavarÚdestÚlowerÚjoin)r   r   ÚmvarfmtÚoptsepÚoptsr%   r   r   r   r   $   s    z*PrettyHelpFormatter._format_option_stringsc                 C   s   |dkrdS |d S )NÚOptionsr   z:
r   )r   Úheadingr   r   r   Úformat_heading;   s    z"PrettyHelpFormatter.format_headingc                 C   s   d|   t |¡d¡ }|S )zz
        Ensure there is only one newline between usage and the first heading
        if there is no description.
        z
Usage: %s
ú  )Úindent_linesÚtextwrapÚdedent)r   ÚusageÚmsgr   r   r   Úformat_usage@   s    z PrettyHelpFormatter.format_usagec                 C   sV   |rNt | jdƒrd}nd}| d¡}| ¡ }|  t |¡d¡}d||f }|S dS d S )NÚmainÚCommandsÚDescriptionÚ
r/   z%s:
%s
r   )ÚhasattrÚparserÚlstripÚrstripr0   r1   r2   )r   ÚdescriptionÚlabelr   r   r   Úformat_descriptionH   s    
z&PrettyHelpFormatter.format_descriptionc                 C   s   |r|S dS d S )Nr   r   )r   Úepilogr   r   r   Úformat_epilogZ   s    z!PrettyHelpFormatter.format_epilogc                    s"   ‡ fdd„|  d¡D ƒ}d |¡S )Nc                    s   g | ]}ˆ | ‘qS r   r   )Ú.0Úline©Úindentr   r   Ú
<listcomp>b   s     z4PrettyHelpFormatter.indent_lines.<locals>.<listcomp>r9   )Úsplitr(   )r   ÚtextrF   Ú	new_linesr   rE   r   r0   a   s    z PrettyHelpFormatter.indent_linesN)r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r.   r5   r@   rB   r0   r   r   r   r   r	      s   
r	   c                   @   s   e Zd ZdZdd„ ZdS )ÚUpdatingDefaultsHelpFormatterz®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¡ tj | |¡S )N)r;   Ú_update_defaultsÚdefaultsr   r   Úexpand_defaultr   r   r   r   rR   m   s    
z,UpdatingDefaultsHelpFormatter.expand_defaultN)rK   rL   rM   rN   rR   r   r   r   r   rO   f   s   rO   c                   @   s    e Zd Zdd„ Zedd„ ƒZdS )ÚCustomOptionParserc                 O   s(   | j ||Ž}| j ¡  | j ||¡ |S )z*Insert an OptionGroup at a given position.)Úadd_option_groupÚoption_groupsÚpopr#   )r   Úidxr   r   Úgroupr   r   r   Úinsert_option_groupu   s    
z&CustomOptionParser.insert_option_groupc                 C   s*   | j dd… }| jD ]}| |j ¡ q|S )z<Get a list of all options, including those in option groups.N)Úoption_listrU   Úextend)r   ÚresÚir   r   r   Úoption_list_all~   s    
z"CustomOptionParser.option_list_allN)rK   rL   rM   rY   Úpropertyr^   r   r   r   r   rS   s   s   	rS   c                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚConfigOptionParserzsCustom option parser which updates its defaults by checking the
    configuration files and environmental variablesc                 O   sD   |  d¡| _|  dd¡}t|ƒ| _| js,t‚tjj| f|ž|Ž d S )NÚnameÚisolatedF)rV   ra   r   ÚconfigÚAssertionErrorr   ÚOptionParserr   )r   r   r   rb   r   r   r   r   Œ   s
    

zConfigOptionParser.__init__c              
   C   sN   z|  ||¡W S  tjk
rH } ztd| ƒ t d¡ W 5 d }~X Y nX d S )Nz*An error occurred during configuration: %sé   )Úcheck_valuer   ÚOptionValueErrorÚprintÚsysÚexit)r   r   ÚkeyÚvalÚexcr   r   r   Úcheck_default•   s
    z ConfigOptionParser.check_defaultc                 c   s”   d| j dg}dd„ |D ƒ}| j ¡ D ]D\}}|s>t d|¡ q$| dd¡\}}||kr$||  ||f¡ q$|D ] }|| D ]\}}||fV  qzqnd S )NÚglobalz:env:c                 S   s   i | ]
}|g “qS r   r   )rC   ra   r   r   r   Ú
<dictcomp>¡   s      zGConfigOptionParser._get_ordered_configuration_items.<locals>.<dictcomp>z7Ignoring configuration key '%s' as it's value is empty.Ú.r   )ra   rc   ÚitemsÚloggerÚdebugrH   r    )r   Úoverride_orderÚsection_itemsÚsection_keyrm   Úsectionrl   r   r   r   Ú _get_ordered_configuration_itemsœ   s    þz3ConfigOptionParser._get_ordered_configuration_itemsc              	      sH  t  ˆj¡ˆ_tƒ }ˆ ¡ D �]\‰ }ˆ dˆ  ¡‰ˆdkr>qˆjdkr„zt|ƒ}W n, t	k
r€   t
ˆjˆ |ƒ}ˆ |¡ Y nX n’ˆjdkr®| ¡ }‡ ‡‡fdd„|D ƒ}nhˆjdk�r| ˆj¡ ˆ ¡ }ˆ ||¡}ˆjpâd}ˆjpìi }ˆjˆ||ˆf|ž|Ž nˆ ˆˆ |¡}||ˆj< q|D ]‰ tˆjˆ ƒ|ˆ < �q&dˆ_|S )	z¢Updates the given defaults with values from the config files and
        the environ. Does a little special handling for certain types of
        options (lists).z--N)Ú
store_trueÚstore_falseÚcountr    c                    s   g | ]}ˆ  ˆˆ |¡‘qS r   )ro   )rC   Úv©rl   r   r   r   r   rG   Ò   s     z7ConfigOptionParser._update_defaults.<locals>.<listcomp>Úcallbackr   )r   ÚValuesrQ   ÚvaluesÚsetrz   Ú
get_optionÚactionr   Ú
ValueErrorÚinvalid_config_error_messageÚerrorrH   Úaddr&   Úget_opt_stringÚconvert_valueÚcallback_argsÚcallback_kwargsr€   ro   Úgetattr)r   rQ   Ú	late_evalrm   Ú	error_msgÚopt_strr   r   r   r   r   rP   ´   s@    
  ÿ


z#ConfigOptionParser._update_defaultsc              
   C   s¬   | j st | j¡S z| j ¡  W n2 tk
rR } z|  tt	|ƒ¡ W 5 d}~X Y nX |  
| j ¡ ¡}|  ¡ D ]4}| |j¡}t|tƒrl| ¡ }| ||¡||j< qlt |¡S )z‹Overriding to make updating the defaults after instantiation of
        the option parser possible, _update_defaults() does the dirty work.N)Úprocess_default_valuesr   r�   rQ   rc   Úloadr   rk   r   ÚstrrP   ÚcopyÚ_get_all_optionsÚgetr&   Ú
isinstancer   rŠ   rg   )r   ÚerrrQ   r   Údefaultr‘   r   r   r   Úget_default_valueså   s    "
z%ConfigOptionParser.get_default_valuesc                 C   s    |   tj¡ |  td| ¡ d S )Nz%s
)Úprint_usagerj   Ústderrrk   r   )r   r4   r   r   r   rˆ   ú   s    zConfigOptionParser.errorN)
rK   rL   rM   rN   r   ro   rz   rP   r›   rˆ   r   r   r   r   r`   ˆ   s   	1r`   c                 C   s    | dkrd  ||¡S d  ||¡S )zQReturns a better error message when invalid configuration option
    is provided.)r{   r|   zo{0} is not a valid value for {1} option, please specify a boolean value like yes/no, true/false or 1/0 instead.z[{0} is not a valid value for {1} option, please specify a numerical value like 1/0 instead.)Úformat)r…   rl   rm   r   r   r   r‡   ÿ   s     þ þr‡   )rN   Ú
__future__r   Úloggingr   rj   r1   Údistutils.utilr   Zpip._vendor.sixr   Úpip._internal.cli.status_codesr   Úpip._internal.configurationr   r   Úpip._internal.utils.compatr   Ú	getLoggerrK   rt   r   r	   rO   re   rS   r`   r‡   r   r   r   r   Ú<module>   s    
Ow