U .e%@sdZddlmZddlZddlZddlZddlZddlmZddl m Z ddl m Z ddl mZmZddlmZeeZGd d d ejZGd d d eZGd ddejZGdddeZddZdS)zBase option parser setup)absolute_importN) strtobool) string_types) UNKNOWN_ERROR) ConfigurationConfigurationError)get_terminal_sizec@sReZdZdZddZddZddd Zd d Zd d ZddZ ddZ ddZ dS)PrettyHelpFormatterz4A prettier/less verbose help formatter for optparse.cOs:d|d<d|d<tdd|d<tjj|f||dS)NZmax_help_positionZindent_incrementrwidth)roptparseIndentedHelpFormatter__init__)selfargskwargsr, )_format_option_stringsroptionrrrformat_option_strings!sz)PrettyHelpFormatter.format_option_stringsrrcCs|g}|jr||jd|jr0||jdt|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_optsappendZ _long_optsleninsertZ takes_valuemetavardestlowerjoin)rrZmvarfmtZoptsepZoptsr rrrr$s  z*PrettyHelpFormatter._format_option_stringscCs|dkr dS|dS)NZOptionsrz: r)rZheadingrrrformat_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_linestextwrapdedent)rZusagemsgrrr format_usage@sz PrettyHelpFormatter.format_usagecCsV|rNt|jdrd}nd}|d}|}|t|d}d||f}|SdSdS)NmainZCommandsZ Description r%z%s: %s r)hasattrparserlstriprstripr&r'r()r descriptionZlabelrrrformat_descriptionHs   z&PrettyHelpFormatter.format_descriptioncCs|r|SdSdS)Nrr)rZepilogrrr format_epilogZsz!PrettyHelpFormatter.format_epilogcs"fdd|dD}d|S)Ncsg|] }|qSrr).0lineindentrr bsz4PrettyHelpFormatter.indent_lines..r,)splitr#)rtextr7Z new_linesrr6rr&asz PrettyHelpFormatter.indent_linesN)rr) __name__ __module__ __qualname____doc__rrrr$r*r2r3r&rrrrr s r c@seZdZdZddZdS)UpdatingDefaultsHelpFormatterzCustom 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|jjtj||S)N)r._update_defaultsdefaultsrrexpand_defaultrrrrrBms z,UpdatingDefaultsHelpFormatter.expand_defaultN)r;r<r=r>rBrrrrr?fsr?c@s eZdZddZeddZdS)CustomOptionParsercOs(|j||}|j|j|||S)z*Insert an OptionGroup at a given position.)Zadd_option_group option_groupspopr)ridxrrgrouprrrinsert_option_groupus  z&CustomOptionParser.insert_option_groupcCs*|jdd}|jD]}||jq|S)ztd|q$|dd\}}||kr$||||fq$|D] }||D]\}}||fVqzqndS)Nglobalz:env:cSsi|] }|gqSrr)r4rOrrr szGConfigOptionParser._get_ordered_configuration_items..z7Ignoring configuration key '%s' as it's value is empty..r )rOrQitemsloggerdebugr9r)rZoverride_orderZ section_itemsZ section_keyrZZsectionrYrrr _get_ordered_configuration_itemss z3ConfigOptionParser._get_ordered_configuration_itemsc sHtj_t}D]\}ddkr>qjdkrz t|}Wn,t k rt j|} |YnXnjdkr| }fdd|D}nhjdkr| j}||}jpd}jpi}j||f||n|}||j<q|D]tj|<q&d_|S) zUpdates 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_falsecountrcsg|]}|qSr)r\)r4vrYrrrrr8sz7ConfigOptionParser._update_defaults..callbackr)rValuesrAvaluessetrcZ get_optionactionr ValueErrorinvalid_config_error_messageerrorr9addr!get_opt_stringZ convert_valueZ callback_argsZcallback_kwargsrir\getattr)rrAZ late_evalrZZ error_msgopt_strrrrrhrr@s@         z#ConfigOptionParser._update_defaultsc Cs|jst|jSz|jWn2tk rR}z|tt |W5d}~XYnX| |j }| D]4}| |j}t|trl|}|||||j<qlt|S)zOverriding to make updating the defaults after instantiation of the option parser possible, _update_defaults() does the dirty work.N)Zprocess_default_valuesrrjrArQloadrrXrstrr@copyZ_get_all_optionsgetr! isinstancerrrrU)rerrrArdefaultrtrrrget_default_valuess "   z%ConfigOptionParser.get_default_valuescCs |tj|td|dS)Nz%s )Z print_usagerWstderrrXr)rr)rrrrps zConfigOptionParser.errorN) r;r<r=r>rr\rcr@r|rprrrrrNs 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)rmrYrZrrrrosro)r>Z __future__rZloggingrrWr'Zdistutils.utilrZpip._vendor.sixrZpip._internal.cli.status_codesrZpip._internal.configurationrrZpip._internal.utils.compatrZ getLoggerr;rarr r?rSrCrNrorrrrs       O w