3 \xE@sdZddlZddlZddlZddlZddlTdZejdeZejdeefZ e j ddZ Gd d d Z d d Zd dejDZddZddZGdddZedkrdZx2dD]*ZedeedjeeeeqWdS)a6distutils.fancy_getopt Wrapper around the standard getopt module that provides the following additional features: * short and long options are tied together * options have help strings, so fancy_getopt could potentially create a complete usage summary * options set attributes of a passed-in object N)*z[a-zA-Z](?:[a-zA-Z0-9-]*)z^%s$z ^(%s)=!(%s)$-_c@seZdZdZdddZddZddZd d d Zd d Zd dZ ddZ ddZ ddZ ddZ d!ddZddZd"ddZd#ddZdS)$ FancyGetoptaWrapper around the standard 'getopt()' module that provides some handy extra functionality: * short and long options are tied together * options have help strings, and help text can be assembled from them * options set attributes of a passed-in object * boolean options can have "negative aliases" -- eg. if --quiet is the "negative alias" of --verbose, then "--quiet" on the command line sets 'verbose' to false NcCsN||_i|_|jr|ji|_i|_g|_g|_i|_i|_i|_ g|_ dS)N) option_table option_index _build_indexaliasnegative_alias short_opts long_opts short2long attr_name takes_arg option_order)selfrr./usr/lib64/python3.6/distutils/fancy_getopt.py__init__)s zFancyGetopt.__init__cCs,|jjx|jD]}||j|d<qWdS)Nr)rclearr)roptionrrrrQs  zFancyGetopt._build_indexcCs||_|jdS)N)rr)rrrrrset_option_tableVszFancyGetopt.set_option_tablecCs<||jkrtd|n |||f}|jj|||j|<dS)Nz'option conflict: already an option '%s')rDistutilsGetoptErrorrappend)r long_optionZ short_optionZ help_stringrrrr add_optionZs     zFancyGetopt.add_optioncCs ||jkS)zcReturn true if the option table for this parser has an option with long name 'long_option'.)r)rrrrr has_optioncszFancyGetopt.has_optioncCs |jtS)zTranslate long option name 'long_option' to the form it has as an attribute of some object: ie., translate hyphens to underscores.) translate longopt_xlate)rrrrr get_attr_namehszFancyGetopt.get_attr_namecCsRxL|jD]@\}}||jkr.td|||f||jkr td|||fq WdS)Nz(invalid %s '%s': option '%s' not definedz0invalid %s '%s': aliased option '%s' not defined)itemsrr)raliasesZwhatr optrrr_check_alias_dictns  zFancyGetopt._check_alias_dictcCs|j|d||_dS)z'Set the aliases for this option parser.r N)r#r )rr rrr set_aliasesxs zFancyGetopt.set_aliasescCs|j|d||_dS)zSet the negative aliases for this option parser. 'negative_alias' should be a dictionary mapping option names to option names, both the key and value must already be defined in the option table.znegative aliasN)r#r )rr rrrset_negative_aliases}s z FancyGetopt.set_negative_aliasescCsg|_g|_|jji|_x|jD]}t|dkrH|\}}}d}n(t|dkrb|\}}}}ntd|ft|t  st|dkrt d||dkpt|t ot|dkst d |||j|<|jj ||dd kr|r|d }|dd}d|j |<nF|j j|}|dk rB|j |r8t d ||f||jd<d|j |<|jj|}|dk r|j ||j |krt d ||ftj|st d||j||j|<|r&|jj |||j|d<q&WdS)zPopulate the various data structures that keep tabs on the option table. Called by 'getopt()' before it can do anything worthwhile. rzinvalid option tuple: %rz9invalid long option '%s': must be a string of length >= 2Nz:invalid short option '%s': must a single character or None=:z>invalid negative alias '%s': aliased option '%s' takes a valuezginvalid alias '%s': inconsistent with aliased option '%s' (one of them takes a value, the other doesn'tzEinvalid long option name '%s' (must be letters, numbers, hyphens onlyr,r,)r r r rrepeatrlen ValueError isinstancestrrrrr getr longopt_rematchrr)rrlongshorthelpr-Zalias_torrr_grok_option_tables^                   zFancyGetopt._grok_option_tablec Csr|dkrtjdd}|dkr*t}d}nd}|jdj|j}ytj|||j\}}Wn,tjk r}zt |WYdd}~XnXx|D]\}}t |dkr|ddkr|j |d}n |dd}|j j |} | r| }|j|s |jj |} | r| }d}nd}|j|} |r<|jj | dk rsB        zFancyGetopt.getoptcCs|jdkrtdn|jSdS)zReturns the list of (option, value) tuples processed by the previous run of 'getopt()'. Raises RuntimeError if 'getopt()' hasn't been called yet. Nz!'getopt()' hasn't been called yet)r RuntimeError)rrrrget_option_orders  zFancyGetopt.get_option_ordercCsxd}xV|jD]L}|d}|d}t|}|ddkr<|d}|dk rL|d}||kr |}q W|ddd}d}||} d|} |r|g} nd g} x|jD]}|dd \}}} t| | } |ddkr|dd}|dkr| r| jd ||| dfn| jd ||fn:d ||f}| r<| jd ||| dfn| jd|x$| ddD]}| j| |qXWqW| S)zGenerate help text (a list of strings, one per suggested line of output) from the option table for this FancyGetopt object. rr)r*Nr(Nr9zOption summary:r&z --%-*s %sz --%-*s z%s (-%s)z --%-*sr,r,r,)rr. wrap_textr)rheaderZmax_optrr5r6lZ opt_widthZ line_widthZ text_widthZ big_indentlinesr7textZ opt_namesrrr generate_helpsF        zFancyGetopt.generate_helpcCs4|dkrtj}x |j|D]}|j|dqWdS)N )r:stdoutrPwrite)rrLfilelinerrr print_helphszFancyGetopt.print_help)N)NN)NN)N)NN)__name__ __module__ __qualname____doc__rrrrrrr#r$r%r8r>rHrPrVrrrrrs  (  M = OrcCst|}|j||j||S)N)rr%r>)optionsZ negative_optrCrBparserrrr fancy_getoptos r]cCsi|]}dt|qS)r9)ord).0Z_wscharrrr usr`cCs"|dkr gSt||kr|gS|j}|jt}tjd|}dd|D}g}x|rg}d}xZ|rt|d}|||kr|j|d|d=||}q`|r|d ddkr|d =Pq`W|r |dkr|j|dd||d|d|d<|dddkr |d=|jdj|qPW|S) zwrap_text(text : string, width : int) -> [string] Split 'text' into multiple lines of no more than 'width' characters each, and return the list of strings that results. Nz( +|-+)cSsg|] }|r|qSrr)r_Zchrrr szwrap_text..rr)r9r,r,)r. expandtabsrWS_TRANSresplitrr=)rOwidthZchunksrNZcur_lineZcur_lenrMrrrrKws:      rKcCs |jtS)zXConvert a long option name to a valid Python identifier by changing "-" to "_". )rr)r"rrrtranslate_longoptsrhc@seZdZdZgfddZdS)r<z_Dummy class just used as a place to hold command-line option values as instance attributes.cCsx|D]}t||dqWdS)zkCreate a new OptionDummy instance. The attributes listed in 'options' will be initialized to None.N)rA)rr[r"rrrrs zOptionDummy.__init__N)rWrXrYrZrrrrrr<sr<__main__zTra-la-la, supercalifragilisticexpialidocious. How *do* you spell that odd word, anyways? (Someone ask Mary -- she'll know [or she'll say, "How should I know?"].) (z width: %drQ)rjrkrlrm)rZr:stringrer>Zdistutils.errorsZ longopt_patcompiler3Z neg_alias_rer1 maketransrrr]Z whitespacerdrKrhr<rWrOwprintr=rrrr s* T6