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/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_namecCs`t|tstxL|jD]@\}}||jkr= 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 ValueErrorr strrrrr getr longopt_rematchrr)rrlongshorthelpr0Zalias_torrr_grok_option_tables^                   zFancyGetopt._grok_option_tablec Cs|dkrtjdd}|dkr*t}d}nd}|jdj|j}ytj|||j\}}Wn,tjk r}zt |WYdd}~XnXx|D]\}}t |dkr|ddkr|j |d}n,t |dkr|ddd kst |dd}|j j|} | r| }|j|sB|d ks"t d |jj|} | r>| }d}nd}|j|} |rt|jj| dk rtt|| dd}t|| ||jj||fqW|r||fS|SdS) aParse command-line options in args. Store as attributes on object. If 'args' is None or not supplied, uses 'sys.argv[1:]'. If 'object' is None or not supplied, creates a new OptionDummy object, stores option values there, and returns a tuple (args, object). If 'object' is supplied, it is modified in place and 'getopt()' just returns 'args'; in both cases, the returned 'args' is a modified copy of the passed-in 'args' list, which is left untouched. Nr,TF r+rrz--zboolean option can't have value)sysargv OptionDummyr:joinr getoptr errorZDistutilsArgErrorr1r r"r r4rr rr0getattrsetattrrr) rargsobjectZcreated_objectr Zoptsmsgr%valr attrrrrrAsF         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+Nr;zOption summary:r)z --%-*s %sz --%-*s z%s (-%s)z --%-*sr/r/r/)rr1 wrap_textr)rheaderZmax_optrr7r8lZ opt_widthZ line_widthZ text_widthZ big_indentlinesr9textZ opt_namesrrr generate_helpsF        zFancyGetopt.generate_helpcCs4|dkrtj}x |j|D]}|j|dqWdS)N )r=stdoutrSwrite)rrOfilelinerrr print_helphszFancyGetopt.print_help)N)NN)NN)N)NN)__name__ __module__ __qualname____doc__rrrrrrr&r'r(r:rArKrSrYrrrrrs  (  M = OrcCst|}|j||j||S)N)rr(rA)optionsZ negative_optrFrEparserrrr fancy_getoptos r`cCsi|]}dt|qS)r;)ord).0Z_wscharrrr usrccCs"|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)rbZchrrr szwrap_text..rr,r;r<r/r/)r1 expandtabsrWS_TRANSresplitrr@)rRwidthZchunksrQZcur_lineZcur_lenrPrrrrNws:      rNcCs |jtS)zXConvert a long option name to a valid Python identifier by changing "-" to "_". )rr)r%rrrtranslate_longoptsrjc@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)rD)rr^r%rrrrs zOptionDummy.__init__N)rZr[r\r]rrrrrr?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: %drT)rlrmrnro)r]r=stringrgrAZdistutils.errorsZ longopt_patcompiler5Z neg_alias_rer3 maketransrrr`Z whitespacerfrNrjr?rZrRwprintr@rrrr s* T6