o
    LK&hE                     @  s  d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
 ddlmZmZ dZed	e d
Zede de dZeddZG dd dZd#ddZdd ejD Zdd Zdd ZG dd dZedkrdZd D ]Zed!e  ed" eee e  qtdS dS )$a6  distutils.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
    )annotationsN)Sequence)Any   )DistutilsArgErrorDistutilsGetoptErrorz[a-zA-Z](?:[a-zA-Z0-9-]*)^$z^(z)=!(z)$-_c                   @  s   e Zd ZdZd!ddZdd Zdd Zd"d	d
Zdd Zdd Z	dd Z
dd Zdd Zdd Zd"d#ddZdd Zd!ddZd"dd ZdS )$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
    Nc                 C  sN   || _ i | _| j r|   i | _i | _g | _g | _i | _i | _i | _	g | _
d S N)option_tableoption_index_build_indexaliasnegative_alias
short_opts	long_opts
short2long	attr_name	takes_argoption_orderselfr    r   U/var/www/html/venv/lib/python3.10/site-packages/setuptools/_distutils/fancy_getopt.py__init__1   s   	
zFancyGetopt.__init__c                 C  s(   | j   | jD ]	}|| j |d < qd S )Nr   )r   clearr   )r   optionr   r   r   r   Y   s   

zFancyGetopt._build_indexc                 C  s   || _ |   d S r   )r   r   r   r   r   r   set_option_table^   s   zFancyGetopt.set_option_tablec                 C  s>   || j v rtd| d|||f}| j| || j |< d S )Nz$option conflict: already an option '')r   r   r   append)r   long_optionshort_optionhelp_stringr   r   r   r   
add_optionb   s   


zFancyGetopt.add_optionc                 C  s
   || j v S )zcReturn true if the option table for this parser has an
        option with long name 'long_option'.)r   r   r#   r   r   r   
has_optionl   s   
zFancyGetopt.has_optionc                 C  s
   | tS )zTranslate long option name 'long_option' to the form it
        has as an attribute of some object: ie., translate hyphens
        to underscores.	translatelongopt_xlater'   r   r   r   get_attr_nameq      
zFancyGetopt.get_attr_namec              	   C  sp   t |tsJ | D ]*\}}|| jvr"td| d| d| d|| jvr5td| d| d| dqd S )Nzinvalid z 'z': option 'z' not defined': aliased option ')
isinstancedictitemsr   r   )r   aliaseswhatr   optr   r   r   _check_alias_dictw   s   

zFancyGetopt._check_alias_dictc                 C     |  |d || _dS )z'Set the aliases for this option parser.r   N)r5   r   )r   r   r   r   r   set_aliases   s   
zFancyGetopt.set_aliasesc                 C  r6   )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.znegative aliasN)r5   r   )r   r   r   r   r   set_negative_aliases   s   
z FancyGetopt.set_negative_aliasesc                 C  s  g | _ g | _| j  i | _| jD ]}t|dkr!|\}}}d}nt|dkr.|\}}}}ntd|t|t	r@t|dk rHt
d| d|du s_t|t	rWt|d	ks_t
d
| d|| j|< | j | |d dkr|rv|d }|dd }d| j|< n$| j|}|dur| j| rt
d| d| d|| j d< d| j|< | j|}|dur| j| | j| krt
d| d| dt|st
d| d| || j|< |r| j| || j|d < qdS )zPopulate the various data structures that keep tabs on the
        option table.  Called by 'getopt()' before it can do anything
        worthwhile.
           r      zinvalid option tuple:    zinvalid long option 'z"': must be a string of length >= 2Nr   zinvalid short option 'z"': must a single character or None=:Tzinvalid negative alias 'r.   z' takes a valueFzinvalid alias 'z%': inconsistent with aliased option 'z/' (one of them takes a value, the other doesn'tzinvalid long option name 'z)' (must be letters, numbers, hyphens only)r   r   r   r   repeatr   len
ValueErrorr/   strr   r"   r   r   getr   
longopt_rematchr,   r   )r   r   longshorthelpr?   alias_tor   r   r   _grok_option_table   sl   











zFancyGetopt._grok_option_tableargsSequence[str] | Nonec              
   C  s  |du rt jdd }|du rt }d}nd}|   d| j}zt||| j\}}W n tjy> } zt	|d}~ww |D ]y\}}t
|dkrY|d dkrY| j|d  }nt
|dkrg|dd d	ksiJ |dd }| j|}	|	ry|	}| j| s|d
ksJ d| j|}	|	r|	}d}nd}| j| }
|r| j|
durt||
dd }t||
| | j||f qA|r||fS |S )a  Parse 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;   r   r
   z-- zboolean option can't have value)sysargvOptionDummyrJ   joinr   getoptr   errorr   r@   r   r   rC   r   r   r   r?   getattrsetattrr   r"   )r   rK   objectcreated_objectr   optsmsgr4   valr   attrr   r   r   rS      sJ    

zFancyGetopt.getoptc                 C  s   | j du r	td| j S )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)r   r   r   r   get_option_order  s   
zFancyGetopt.get_option_orderc                 C  s  d}| j D ]&}|d }|d }t|}|d dkr|d }|dur%|d }||kr+|}q|d d d }d}|| }	d	| }
|rD|g}nd
g}| j D ]y}|dd \}}}t||	}|d dkrf|dd }|du r|r~|d|d| d|d   n5|d|d|  n(| d| d}|r|d|d| d|d   n|d|d|  |dd D ]	}||
|  qqJ|S )zGenerate help text (a list of strings, one per suggested line of
        output) from the option table for this FancyGetopt object.
        r   r   r<   r=   N   r;   N   rM   zOption summary:r9   z  --<z  z (-))r   r@   	wrap_textr"   )r   headermax_optr   rF   rG   ell	opt_width
line_width
text_width
big_indentlinesrH   text	opt_namesr   r   r   generate_help'  sH   


$$zFancyGetopt.generate_helpc                 C  s0   |d u rt j}| |D ]	}||d  qd S )N
)rO   stdoutrn   write)r   rd   fileliner   r   r   
print_helpu  s
   zFancyGetopt.print_helpr   )NNrK   rL   )__name__
__module____qualname____doc__r   r   r    r&   r(   r,   r5   r7   r8   rJ   rS   r^   rn   rt   r   r   r   r   r   %   s     
(

P=

Nr   rK   rL   c                 C  s   t | }|| |||S r   )r   r8   rS   )optionsnegative_optrW   rK   parserr   r   r   fancy_getopt|  s   
r}   c                 C  s   i | ]}t |d qS )rM   )ord).0_wscharr   r   r   
<dictcomp>  s    r   c                 C  s  | du rg S t | |kr| gS |  } | t} td| }dd |D }g }|rg }d}|rZt |d }|| |krJ||d  |d= || }n|rW|d d dkrW|d= n|s/|r|dkru||d d|  |d |d |d< |d d dkr|d= |d| |s)|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( +|-+)c                 S  s   g | ]}|r|qS r   r   )r   chr   r   r   
<listcomp>  s    zwrap_text.<locals>.<listcomp>r   r<   rM   rN   )r@   
expandtabsr*   WS_TRANSresplitr"   rR   )rl   widthchunksrk   cur_linecur_lenrf   r   r   r   rc     s>   

"rc   c                 C  s
   |  tS )zXConvert a long option name to a valid Python identifier by
    changing "-" to "_".
    r)   )r4   r   r   r   translate_longopt  r-   r   c                   @  s   e Zd ZdZg fdddZdS )rQ   z_Dummy class just used as a place to hold command-line option
    values as instance attributes.rz   Sequence[Any]c                 C  s   |D ]}t | |d qdS )zkCreate a new OptionDummy instance.  The attributes listed in
        'options' will be initialized to None.N)rV   )r   rz   r4   r   r   r   r     s   zOptionDummy.__init__N)rz   r   )rv   rw   rx   ry   r   r   r   r   r   rQ     s    rQ   __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: ro   ru   )!ry   
__future__r   rS   r   stringrO   collections.abcr   typingr   errorsr   r   longopt_patcompilerD   neg_alias_rerB   	maketransr+   r   r}   
whitespacer   rc   r   rQ   rv   rl   wprintrR   r   r   r   r   <module>   s:    
  
Y6