U
    .e                     @  s  d Z ddlmZ ddlZddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZmZmZ d	Zd
 ZedZdddddZdNddddddZdOddddddZdPdddddddZdQddddddZdRddddd!d"d#ZeedZdSddd%dd&d'd(Zdddd)d*d+ZdTddddd,d-d.ZdUddddd0d1d2ZdVd4dddd5d6d7Z dWddddd9dd:d;d<Z!dddd=d>d?Z"ed@fddAdBdddCdDdEZ#ddddFdGdHZ$ddddIdJdKZ%ej&Z&e&j'Z(e&j)Z*G dLdM dMe&Z+dS )XzText formatting utilities.    )annotationsN)partial)pformat)Matchfill)AnyCallablePattern)abbrabbrtaskdedentdedent_initialensure_newlines
ensure_sepfill_paragraphsindentjoin	pluralizeprettystr_to_listsimple_formattruncatez
Unknown format %{0} in string {1!r}.
Possible causes: Did you forget to escape the expand sign (use '%%{0!r}'),
or did you escape and the value was expanded twice? (%%N -> %N -> %hostname)?
z%(\w)strz	list[str])sreturnc                 C  s   t | tr| dS | S )zConvert string to list.,)
isinstancer   split)r    r   5/tmp/pip-unpacked-wheel-f4liivr4/celery/utils/text.pyr      s    

r      int)r   nr   c                 C  s$   | d| d| kr | |d S | S )z+Remove indentation from first line of text.N r   )r   r#   r   r   r    r   #   s    r   
)r   sepr   c                 C  s   | dd |  D S )zRemove indentation.c                 s  s   | ]}t |V  qd S N)r   ).0lr   r   r    	<genexpr>*   s     zdedent.<locals>.<genexpr>)r   
splitlines)r   r&   r   r   r    r   (   s    r   )r   widthr&   r   c                   s   |  fdd| |D S )z4Fill paragraphs with newlines (or custom separator).c                 3  s   | ]}t | V  qd S r'   r   r(   pr,   r   r    r*   /   s     z"fill_paragraphs.<locals>.<genexpr>r   r   )r   r,   r&   r   r/   r    r   -   s    r   )r)   r&   r   c                 C  s   | dd | D S )zConcatenate list of strings.c                 s  s   | ]}|r|V  qd S r'   r   )r(   vr   r   r    r*   4   s      zjoin.<locals>.<genexpr>)r   )r)   r&   r   r   r    r   2   s    r      )r&   r   r#   r   c                 C  s   || || |    S )z%Ensure text s ends in separator sep'.)count)r&   r   r#   r   r   r    r   7   s    r   ...z
str | bool)Smaxellipsisr   c                 C  sJ   | dkrdS t | |krFt|tr:| d|t |  | pD| d| S | S )zAbbreviate word.N???)lenr   r   )r5   r6   r7   r   r   r    r   ?   s    

r   )r5   r6   r   c                 C  sP   | dkrdS t | |krL| d\}}}t||t | d d}|d | S | S )zAbbreviate task name.Nr8   .   Fz[.])r9   
rpartitionr   )r5   r6   module_clsr   r   r    r   I   s    r   )tr   r&   r   c                   s   |  fdd| |D S )zIndent text.c                 3  s   | ]}d   | V  qdS )r$   Nr   r-   r   r   r    r*   V   s     zindent.<locals>.<genexpr>r0   )r@   r   r&   r   rA   r    r   T   s    r      )r   maxlensuffixr   c                 C  s0   |r,t | |kr,| d| ddd | S | S )z0Truncate text to a maximum number of characters.Nr$      r   )r9   rsplit)r   rC   rD   r   r   r    r   Y   s    r   r   float)r#   textrD   r   c                 C  s   | dkr|| S |S )z*Pluralize term when n is greater than one.rE   r   )r#   rH   rD   r   r   r    r   `   s    r   P   r   )valuer,   nl_widthr&   kwr   c                 K  sh   t | tr(| dt| d|dd  S t | trPd|dt| fd|i|S t| fd|i|S dS )z%Format value for printing to console.r$   r!   rE   Nz{}{}{}z    r,   )r   dictr   tupleformat)rJ   r,   rK   r&   rL   r   r   r    r   g   s    

  r   )r   otherr   c                 C  s   |  r|  S |  S r'   )isupperupperlower)r   rP   r   r   r    
match_caset   s    rT   z\1zdict[str, str | Callable]zPattern[str])r   keyspatternexpandr   c                   s8   r4 dd ddd fdd}||S S )z0Format string, expanding abbreviations in keys'.%r   z	str | Any)matchr   c                   sN   |   }z| }W n$ tk
r:   tt|Y nX t|rJ| S |S r'   )rW   KeyError
ValueErrorUNKNOWN_SIMPLE_FORMAT_KEYrO   callable)rY   keyresolverrW   rU   r   r   r    resolve   s    
zsimple_format.<locals>.resolve)
setdefaultsub)r   rU   rV   rW   ra   r   r`   r    r   x   s
    
r   )	task_namer   r   c                 C  s    t | dd d }t||S )zGiven task name, remove repeating module names.

    Example:
        >>> remove_repeating_from_task(
        ...     'tasks.add',
        ...     'tasks.add(2, 2), tasks.mul(3), tasks.div(4)')
        'tasks.add(2, 2), mul(3), div(4)'
    r:   r   )r   r<   remove_repeating)rd   r   r=   r   r   r    remove_repeating_from_task   s    rf   )substrr   r   c                 C  sL   | | }|dkrHd|d|t|   ||t|  d | dgS |S )a  Remove repeating module names from string.

    Arguments:
        task_name (str): Task name (full path including module),
            to use as the basis for removing module names.
        s (str): The string we want to work on.

    Example:

        >>> _shorten_names(
        ...    'x.tasks.add',
        ...    'x.tasks.add(2, 2) | x.tasks.add(4) | x.tasks.mul(8)',
        ... )
        'x.tasks.add(2, 2) | add(4) | mul(8)'
    r    N)findr   r9   replace)rg   r   indexr   r   r    re      s    
re   c                   @  s6   e Zd ZdZddddddddZd	d
dddZdS )
WhateverIOz!StringIO that takes bytes or str.Nzbytes | str | Noner   None)r1   arL   r   c                 O  s(   t | t|tr| n|f|| d S r'   )	_SIO_initr   bytesdecode)selfr1   rn   rL   r   r   r    __init__   s    zWhateverIO.__init__zbytes | strr"   )datar   c                 C  s   t | t|tr| n|S r'   )
_SIO_writer   rp   rq   )rr   rt   r   r   r    write   s
    
zWhateverIO.write)N)__name__
__module____qualname____doc__rs   rv   r   r   r   r    rl      s    rl   )r!   )r%   )r%   )r%   )r2   )r4   )r   r%   )rB   r4   )r   )rI   rI   r%   ),rz   
__future__r   iore	functoolsr   pprintr   r   textwrapr   typingr   r	   r
   __all__stripr\   compileZ	RE_FORMATr   r   r   r   r   r   r   r   r   r   r   r   r   rT   r   rf   re   StringIOrv   ru   rs   ro   rl   r   r   r   r    <module>   sD   


 