a
    ijJ7                     @   s  U d Z ddlZddlZddlZddlZddlZddlZddlmZm	Z	m
Z
mZmZmZmZmZ ddlmZ eej ed< zddlZW n ey   dZY n0 eej ed< zddlZW n ey   dZY n0 dZdZd	Zed
Zeeje hZee  ed< dZ!eed< dZ"eej ed< G dd deZ#e	e$ef ee# dddZ%e#dddZ&e$dddZ'ej(e$eej)dddZ*e dddZ+e$ee$ ee$ dddZ,d d! Z-d/e$ee  e$ee$ e$d#d$d%Z.d0e	e$ef eee$  e
e$ d&d'd(Z/e$e$d)d*d+Z0e$e$d,d-d.Z1dS )1z:Internal helper functions for Abseil Python flags library.    N)AnyDictIterableList
NamedTupleOptionalSequenceSet)minidomfcntltermiosP   (   g      ?u    [ -----￾￿]disclaim_module_idsSPECIAL_FLAGSFLAGS_MODULEc                   @   s$   e Zd ZU dZejed< eed< dS )_ModuleObjectAndNamezkModule object and name.

  Fields:
  - module: object, module object.
  - module_name: str, module name.
  modulemodule_nameN)__name__
__module____qualname____doc__types
ModuleType__annotations__str r   r   Q/home/ghrups/robot-bench/.venv/lib/python3.9/site-packages/absl/flags/_helpers.pyr   S   s   

r   )globals_dictreturnc                 C   sH   z| d }t j| }W n ty*   Y dS 0 t||dkrBt jd n|S )aF  Returns the module that defines a global environment, and its name.

  Args:
    globals_dict: A dictionary that should correspond to an environment
      providing the values of the globals.

  Returns:
    _ModuleObjectAndName - pair of module object & module name.
    Returns None if the module could not be identified.
  r   N__main__r   )sysmodulesKeyErrorr   argv)r   namer   r   r   r   get_module_object_and_name^   s    r'   )r    c                  C   sR   t dt D ]6} t| j}t|}|durt|jtvr|  S qt	ddS )a)  Returns the module that's calling into this module.

  We generally use this function to get the name of the module calling a
  DEFINE_foo... function.

  Returns:
    The module object that called into this one.

  Raises:
    AssertionError: Raised when no calling module could be identified.
     NzNo module was found)
ranger"   getrecursionlimit	_getframe	f_globalsr'   idr   r   AssertionError)depthZglobals_for_framer   r   r   r   "get_calling_module_object_and_nameu   s    
r0   c                   C   s   t  jS )z?Returns the name of the module that's calling into this module.)r0   r   r   r   r   r   get_calling_module   s    r1   )docr&   valuer    c                 C   sD   t |}t|tr| }td|}| |}|| | |S )a  Returns an XML DOM element with name and text value.

  Args:
    doc: minidom.Document, the DOM document it should create nodes from.
    name: str, the tag of XML element.
    value: object, whose string representation will be used
        as the value of the XML element. Illegal or highly discouraged xml 1.0
        characters are stripped.

  Returns:
    An instance of minidom.Element.
   )	r   
isinstanceboollower_ILLEGAL_XML_CHARS_REGEXsubZcreateElementZappendChildZcreateTextNode)r2   r&   r3   ser   r   r   create_xml_dom_element   s    

r<   c               
   C   s   t j rtdu stdu rtS zBtt jtjd} t	d| d }|t
krP|W S ttdtW S  tttjfy~   t Y S 0 dS )zAReturns the integer width of help lines that is used in TextWrap.Ns   1234hhr(   COLUMNS)r"   stdoutisattyr   r   _DEFAULT_HELP_WIDTHZioctl
TIOCGWINSZstructunpack_MIN_HELP_WIDTHintosgetenv	TypeErrorOSErrorerror)datacolumnsr   r   r   get_help_width   s    rN   )attemptlongopt_listr    c           	         s   t  dks|sg S dd |D } fdd|D }|  |d \}}|tt   kr\g S g }|D ] \}}||kr|| qd qqd|S )z4Returns helpful similar matches for an invalid flag.   c                 S   s   g | ]}| d d qS )=r   )split).0vr   r   r   
<listcomp>       z(get_flag_suggestions.<locals>.<listcomp>c                    s&   g | ]}t  |d t  |fqS )r   )_damerau_levenshteinlen)rT   optionrO   r   r   rV      s   r   )rY   sort _SUGGESTION_ERROR_RATE_THRESHOLDappend)	rO   rP   Zoption_namesZ	distancesZleast_errors_Zsuggestionserrorsr&   r   r[   r   get_flag_suggestions   s     
ra   c                    s   i  fdd  | |S )z6Returns Damerau-Levenshtein edit distance from a to b.c                    s   | |fv r| |f S | s&t |}n|s4t | }nt | dd |d  | |dd d  | dd |dd | d |d k }t | dkrt |dkr| d |d kr| d |d kr | dd |dd d }||kr|}|| |f< |S )z5Recursively defined string distance with memoization.r(   Nr   rQ   )rY   min)xydtdistancememor   r   rh      s"    

(8z&_damerau_levenshtein.<locals>.distancer   )abr   rg   r   rX      s    rX   r4   )textlengthindentfirstline_indentr    c                 C   s   |du rt  }|du rd}|du r&|}t||kr:tdt||krNtd| d} g }tj|||d}tj|||d}dd |  D D ](}|r||| n
|	d |}qd	
|S )
aL  Wraps a given text to a maximum line length and returns it.

  It turns lines that only contain whitespace into empty lines, keeps new lines,
  and expands tabs using 4 spaces.

  Args:
    text: str, text to wrap.
    length: int, maximum length of a line, includes indentation.
        If this is None then use get_help_width()
    indent: str, indent for all but first line.
    firstline_indent: str, indent for first line; if None, fall back to indent.

  Returns:
    str, the wrapped text.

  Raises:
    ValueError: Raised if indent or firstline_indent not shorter than length.
  Nr4   zLength of indent exceeds lengthz*Length of first line indent exceeds length   )widthinitial_indentsubsequent_indentc                 s   s   | ]}|  V  qd S N)strip)rT   pr   r   r   	<genexpr>+  rW   ztext_wrap.<locals>.<genexpr>
)rN   rY   
ValueError
expandtabstextwrapTextWrapper
splitlinesextendwrapr^   join)rl   rm   rn   ro   resultwrapperZsubsequent_wrapperZ	paragraphr   r   r   	text_wrap   s0    

r   )flag_mapmulti_flagsr    c              	   c   s   |   D ]\}}|du r$d| V  qt|trJ|r>d| V  qd| V  qt|ttfrhd||f V  qzL|r||v r|D ]}d|t|f V  qznd|ddd |D f V  W q ty   d||f V  Y q0 qdS )a3  Convert a dict of values into process call parameters.

  This method is used to convert a dictionary into a sequence of parameters
  for a binary that parses arguments using this module.

  Args:
    flag_map: dict, a mapping where the keys are flag names (strings).
        values are treated according to their type:

        * If value is ``None``, then only the name is emitted.
        * If value is ``True``, then only the name is emitted.
        * If value is ``False``, then only the name prepended with 'no' is
          emitted.
        * If value is a string then ``--name=value`` is emitted.
        * If value is a collection, this will emit
          ``--name=value1,value2,value3``, unless the flag name is in
          ``multi_flags``, in which case this will emit
          ``--name=value1 --name=value2 --name=value3``.
        * Everything else is converted to string an passed as such.

    multi_flags: set, names (strings) of flags that should be treated as
        multi-flags.
  Yields:
    sequence of string suitable for a subprocess execution.
  Nz--%sz--no%sz--%s=%s,c                 s   s   | ]}t |V  qd S rt   )r   )rT   itemr   r   r   rw   d  rW   z$flag_dict_to_args.<locals>.<genexpr>)itemsr5   r6   bytesr   r   rI   )r   r   keyr3   r   r   r   r   flag_dict_to_args6  s     
"r   )	docstringr    c                 C   s   | sdS d}|    }|}|dd D ]&}| }|r(t|t|t| }q(|d  g}||k r|dd D ]}|||d   qr|r|d s|  q|r|d s|d qd	|S )a  Removes indentation from triple-quoted strings.

  This is the function specified in PEP 257 to handle docstrings:
  https://www.python.org/dev/peps/pep-0257/.

  Args:
    docstring: str, a python docstring.

  Returns:
    str, docstring with indentation removed.
  r4   i    r(   Nr   rx   )
rz   r}   lstriprb   rY   ru   r^   rstrippopr   )r   Z
max_indentlinesrn   linestrippedZtrimmedr   r   r   trim_docstringj  s$    
r   )r2   r    c                 C   sB   |   } tdtj}|d| } t| } tjdd| tjd} | S )z0Takes a __doc__ string and reformats it as help.z^[ 	]+$r4   z(?<=\S)\n(?=\S) )flags)ru   recompileMr9   r   )r2   Zwhitespace_only_liner   r   r   doc_to_help  s    r   )Nr4   N)N)2r   rG   r   rC   r"   r{   r   typingr   r   r   r   r   r   r   r	   Zxml.domr
   r   r   r   ImportErrorr   rA   rE   r]   r   r8   r-   r#   r   r   rF   r   r   r   r   r'   r0   r1   ZDocumentZElementr<   rN   ra   rX   r   r   r   r   r   r   r   r   <module>   st   (


   ? 4*