U ��.e%�@s�dZddlmZddlZddlZddlZddlZddlmZddl m Z ddl m Z ddl mZmZddlmZe�e�ZGd d �d ej�ZGd d �d e�ZGd d�dej�ZGdd�de�Zdd�ZdS)zBase option parser setup�)�absolute_importN)� strtobool)� string_types)� UNKNOWN_ERROR)� Configuration�ConfigurationError)�get_terminal_sizec@sReZdZdZdd�Zdd�Zddd �Zd d �Zd d �Zdd�Z dd�Z dd�Z dS)�PrettyHelpFormatterz4A prettier/less verbose help formatter for optparse.cOs:d|d<d|d<t�dd|d<tjj|f|�|�dS)N�Zmax_help_position�Zindent_incrementr��width)r�optparse�IndentedHelpFormatter�__init__)�self�args�kwargs�r��, )�_format_option_strings�r�optionrrr�format_option_strings!sz)PrettyHelpFormatter.format_option_stringsrrcCs|g}|jr|�|jd�|jr0|�|jd�t|�dkrH|�d|�|��rr|jp^|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 rr �) Z _short_opts�appendZ _long_opts�len�insertZ takes_value�metavar�dest�lower�join)rrZmvarfmtZoptsepZoptsr rrrr$s  z*PrettyHelpFormatter._format_option_stringscCs|dkr dS|dS)NZOptionsrz: r)rZheadingrrr�format_heading;sz"PrettyHelpFormatter.format_headingcCsd|�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)rZusage�msgrrr� format_usage@sz PrettyHelpFormatter.format_usagecCsV|rNt|jd�rd}nd}|�d�}|��}|�t�|�d�}d||f}|SdSdS)N�mainZCommandsZ Description� r%z%s: %s r)�hasattr�parser�lstrip�rstripr&r'r()r� descriptionZlabelrrr�format_descriptionHs   z&PrettyHelpFormatter.format_descriptioncCs|r|SdSdS)Nrr)rZepilogrrr� format_epilogZsz!PrettyHelpFormatter.format_epilogcs"�fdd�|�d�D�}d�|�S)Ncsg|] }�|�qSrr)�.0�line��indentrr� bsz4PrettyHelpFormatter.indent_lines..r,)�splitr#)r�textr7Z new_linesrr6rr&asz PrettyHelpFormatter.indent_linesN)rr) �__name__� __module__� __qualname__�__doc__rrrr$r*r2r3r&rrrrr s r c@seZdZdZdd�ZdS)�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. cCs(|jdk r|j�|jj�tj�||�S)N)r.�_update_defaults�defaultsrr�expand_defaultrrrrrBms z,UpdatingDefaultsHelpFormatter.expand_defaultN)r;r<r=r>rBrrrrr?fsr?c@s eZdZdd�Zedd��ZdS)�CustomOptionParsercOs(|j||�}|j��|j�||�|S)z*Insert an OptionGroup at a given position.)Zadd_option_group� option_groups�popr)r�idxrr�grouprrr�insert_option_groupus  z&CustomOptionParser.insert_option_groupcCs*|jdd�}|jD]}|�|j�q|S)zt�d|�q$|�dd�\}}||kr$||�||f�q$|D] }||D]\}}||fVqzqndS)N�globalz:env:cSsi|] }|g�qSrr)r4rOrrr� �szGConfigOptionParser._get_ordered_configuration_items..z7Ignoring configuration key '%s' as it's value is empty.�.r )rOrQ�items�logger�debugr9r)rZoverride_orderZ section_itemsZ section_keyrZZsectionrYrrr� _get_ordered_configuration_items�s �z3ConfigOptionParser._get_ordered_configuration_itemsc sHt��j��_t�}���D�]\�}��d����dkr>q�jdkr�z t|�}Wn,t k r�t �j�|�}�� |�YnXn��jdkr�|� �}���fdd�|D�}nh�jdk�r|� �j����}��||�}�jp�d}�jp�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�countrcsg|]}����|��qSr)r\)r4�v�rYrrrrr8�sz7ConfigOptionParser._update_defaults..�callbackr)r�ValuesrA�values�setrcZ get_option�actionr� ValueError�invalid_config_error_message�errorr9�addr!�get_opt_stringZ convert_valueZ callback_argsZcallback_kwargsrir\�getattr)rrAZ late_evalrZZ error_msg�opt_strrrrrhrr@�s@  �       z#ConfigOptionParser._update_defaultsc Cs�|jst�|j�Sz|j��Wn2tk rR}z|�tt |��W5d}~XYnX|� |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)Zprocess_default_valuesrrjrArQ�loadrrXr�strr@�copyZ_get_all_options�getr!� isinstancerrrrU)r�errrAr�defaultrtrrr�get_default_values�s "   z%ConfigOptionParser.get_default_valuescCs |�tj�|�td|�dS)Nz%s )Z print_usagerW�stderrrXr)rr)rrrrp�s zConfigOptionParser.errorN) r;r<r=r>rr\rcr@r|rprrrrrN�s 1rNcCs |dkrd�||�Sd�||�S)zQReturns a better error message when invalid configuration option is provided.)rdrezo{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)rmrYrZrrrro�s��ro)r>Z __future__rZloggingrrWr'Zdistutils.utilrZpip._vendor.sixrZpip._internal.cli.status_codesrZpip._internal.configurationrrZpip._internal.utils.compatrZ getLoggerr;rarr r?rSrCrNrorrrr�s       O w