a �DOgxE�@s�dZddlZddlZddlZddlZddlTdZe�de�Ze�deef�Z e � dd�Z Gd d �d �Z d d �Zd d�ejD�Zdd�Zdd�ZGdd�d�Zedkr�dZdD]*Zede�ed�eee���e�q�dS)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@s�eZdZdZddd�Zdd�Zdd�Zd d d �Zd d �Zd d�Z dd�Z dd�Z dd�Z dd�Z d!dd�Zdd�Zd"dd�Zd#dd�ZdS)$� FancyGetopta�Wrapper 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|��i|_i|_g|_g|_i|_i|_i|_ g|_ dS�N) � option_table� option_index� _build_index�alias�negative_alias� short_opts� long_opts� short2long� attr_name� takes_arg� option_order��selfr�r�./usr/lib64/python3.9/distutils/fancy_getopt.py�__init__)s zFancyGetopt.__init__cCs(|j��|jD]}||j|d<qdS)Nr)r�clearr)r�optionrrrr Qs  zFancyGetopt._build_indexcCs||_|��dSr)rr rrrr�set_option_tableVszFancyGetopt.set_option_tablecCs<||jvrtd|��n |||f}|j�|�||j|<dS)Nz'option conflict: already an option '%s')r�DistutilsGetoptErrorr�append)r� long_optionZ short_optionZ help_stringrrrr� add_optionZs �  zFancyGetopt.add_optioncCs ||jvS)zcReturn true if the option table for this parser has an option with long name 'long_option'.)r�rrrrr� has_optioncszFancyGetopt.has_optioncCs |�t�S)z�Translate long option name 'long_option' to the form it has as an attribute of some object: ie., translate hyphens to underscores.�� translate� longopt_xlaterrrr� get_attr_namehszFancyGetopt.get_attr_namecCs\t|t�sJ�|��D]@\}}||jvr:td|||f��||jvrtd|||f��qdS)Nz(invalid %s '%s': option '%s' not definedz0invalid %s '%s': aliased option '%s' not defined)� isinstance�dict�itemsrr)r�aliasesZwhatr �optrrr�_check_alias_dictns � �zFancyGetopt._check_alias_dictcCs|�|d�||_dS)z'Set the aliases for this option parser.r N)r)r )rr rrr� set_aliasesxs zFancyGetopt.set_aliasescCs|�|d�||_dS)z�Set 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 rrr�set_negative_aliases}s z FancyGetopt.set_negative_aliasescCs�g|_g|_|j��i|_|jD�]�}t|�dkrD|\}}}d}n(t|�dkr^|\}}}}ntd|f��t|t �r�t|�dkr�t d|��|dus�t|t �r�t|�dks�t d |��||j|<|j� |�|d d kr�|r�|d }|dd �}d|j |<nF|j �|�}|du�r:|j |�r0t d ||f��||jd <d|j |<|j�|�}|du�r�|j ||j |k�r�t d||f��t�|��s�t d|��|�|�|j|<|r"|j� |�||j|d<q"dS)z�Populate the various data structures that keep tabs on the option table. Called by 'getopt()' before it can do anything worthwhile. �r�zinvalid option tuple: %r�z9invalid long option '%s': must be a string of length >= 2N�z: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 only)r r rr�repeatr�len� ValueErrorr$�strrrrr �getr � longopt_re�matchr#r)rr�long�short�helpr3Zalias_torrr�_grok_option_table�sr     �� ��         ��    �� �� zFancyGetopt._grok_option_tablec Cs�|durtjdd�}|dur*t�}d}nd}|��d�|j�}zt�|||j�\}}Wn.tjy�}zt |��WYd}~n d}~00|D]�\}}t |�dkr�|ddkr�|j |d}n,t |�dkr�|dd�d ks�J�|dd�}|j � |�} | r�| }|j|�s<|d k�sJd ��|j� |�} | �r8| }d}nd}|j|} |�rn|j� | �du�rnt|| d�d}t|| |�|j�||f�q�|�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)�sys�argv� OptionDummyr=�joinr �getoptr �errorZDistutilsArgErrorr4rr r7rr rr3�getattr�setattrrr) r�args�objectZcreated_objectr Zopts�msgr(�valr �attrrrrrD�sF          zFancyGetopt.getoptcCs|jdurtd��n|jSdS)z�Returns 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)rrrr�get_option_orders  zFancyGetopt.get_option_ordercCsjd}|jD]L}|d}|d}t|�}|ddkr:|d}|durJ|d}||kr |}q |ddd}d}||} d |} |r�|g} nd g} |jD]�}|dd �\}}} t| | �} |ddkr�|dd�}|du�r| r�| �d ||| df�n| �d ||f�n:d||f}| �r4| �d ||| df�n| �d|�| dd�D]}| �| |��qNq�| S)z�Generate help text (a list of strings, one per suggested line of output) from the option table for this FancyGetopt object. rr/r0r1N�r.�Nr>zOption summary:r,z --%-*s %sz --%-*s z%s (-%s)z --%-*s)rr4� wrap_textr)r�headerZmax_optrr:r;�lZ opt_widthZ line_width� text_widthZ big_indent�linesr<�textZ opt_namesrrr� generate_helpsH         �zFancyGetopt.generate_helpcCs0|durtj}|�|�D]}|�|d�qdS)N� )r@�stdoutrW�write)rrR�file�linerrr� print_helphszFancyGetopt.print_help)N)NN)NN)N)NN)�__name__� __module__� __qualname__�__doc__rr rrrr#r)r*r+r=rDrNrWr]rrrrrs (  M = OrcCst|�}|�|�|�||�Sr)rr+rD)�optionsZ negative_optrIrH�parserrrr� fancy_getoptos rdcCsi|]}t|�d�qS)r>)�ord)�.0Z_wscharrrr� u�rgcCs|dur gSt|�|kr|gS|��}|�t�}t�d|�}dd�|D�}g}|�rg}d}|r�t|d�}|||kr�|�|d�|d=||}q\|r�|dddkr�|d=q�q\|�r|dkr�|�|dd|��|d|d�|d<|dddk�r|d=|�d�|��qN|S) z�wrap_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)rfZchrrr� �rhzwrap_text..rr0r>r?)r4� expandtabsr!�WS_TRANS�re�splitrrC)rV�width�chunksrUZcur_lineZcur_lenrSrrrrQws:      rQcCs |�t�S)zXConvert a long option name to a valid Python identifier by changing "-" to "_". r )r(rrr�translate_longopt�srpc@seZdZdZgfdd�ZdS)rBz_Dummy class just used as a place to hold command-line option values as instance attributes.cCs|D]}t||d�qdS)zkCreate a new OptionDummy instance. The attributes listed in 'options' will be initialized to None.N)rG)rrbr(rrrr�szOptionDummy.__init__N)r^r_r`rarrrrrrB�srB�__main__z�Tra-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: %drX)rar@�stringrlrDZdistutils.errorsZ longopt_pat�compiler8Z neg_alias_rer6� maketransr"rrd� whitespacerkrQrprBr^rV�w�printrCrrrr�s*  T6