U
    Z+d                     @   s<  d 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mZ dZd	 Zed
Zdd Zd5ddZd6ddZd7ddZd8ddZd9ddZeedZd:ddZdd Zd;dd Zd<d"d#Zd=d%d&Z d>d(d)Z!d*d+ Z"ed,fd-d.Z#d/d0 Z$d1d2 Z%ej&Z&e&j'Z(e&j)Z*G d3d4 d4e&Z+dS )?zText formatting utilities.    N)Callable)partial)pformatfill)AnyListMapping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)c                 C   s   t | tr| dS | S )zConvert string to list.,)
isinstancestrsplit)s r   5/tmp/pip-unpacked-wheel-ucduq0nd/celery/utils/text.pyr      s    

r      c                 C   s$   | d| d| kr | |d S | S )z+Remove indentation from first line of text.N r   )r   nr   r   r   r   "   s    r   
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"   sepr   r   r   r   (   s    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widthr   r   r'   1   s     z"fill_paragraphs.<locals>.<genexpr>r   r   )r   r-   r)   r   r,   r   r   .   s    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'   7   s      zjoin.<locals>.<genexpr>)r   )r&   r)   r   r   r   r   4   s    r      c                 C   s   || || |    S )z%Ensure text s ends in separator sep'.)count)r)   r   r"   r   r   r   r   :   s    r   ...c                 C   sD   | dkrdS t | |kr@|r4| d|t |  | p>| d| S | S )zAbbreviate word.N???)len)SmaxZellipsisr   r   r   r   C   s
    (r   c                 C   sP   | dkrdS t | |krL| d\}}}t||t | d d}|d | S | S )zAbbreviate task name.Nr3   .   Fz[.])r4   
rpartitionr   )r5   r6   module_clsr   r   r   r   M   s    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'   \   s     zindent.<locals>.<genexpr>r.   )tr   r)   r   r=   r   r   Y   s    r      c                 C   s0   |r,t | |kr,| d| ddd | S | S )z0Truncate text to a maximum number of characters.Nr!      r   )r4   rsplit)r   maxlensuffixr   r   r   r   _   s    r   r   c                 C   s   | dkr|| S |S )z*Pluralize term when n is greater than one.r@   r   )r"   textrC   r   r   r   r   g   s    r   P   c                 K   sj   t | tr*d| dt| d|dd  S t | trRd|dt| fd|i|S t| fd|i|S dS )	z%Format value for printing to console.{r!   r    r@   Nz{}{}{}z    r-   )r   dictr   tupleformat)valuer-   Znl_widthr)   kwr   r   r   r   o   s    
 
  r   c                 C   s   |  r|  S |  S r$   )isupperupperlower)r   otherr   r   r   
match_case|   s    rP   z\1c                    s0   r, dd  fdd}||S S )z0Format string, expanding abbreviations in keys'.%c                    sP   |   }z| }W n$ tk
r:   tt|Y nX t|trL| S |S r$   )expandKeyError
ValueErrorUNKNOWN_SIMPLE_FORMAT_KEYrI   r   r   )matchkeyresolverrR   keysr   r   r   resolve   s    

zsimple_format.<locals>.resolve)
setdefaultsub)r   rZ   patternrR   r[   r   rY   r   r      s
    
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)'
    r7   r   )r   r9   remove_repeating)Z	task_namer   r:   r   r   r   remove_repeating_from_task   s    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   r4   replace)substrr   indexr   r   r   r_      s    
r_   c                   @   s"   e Zd ZdZdddZdd ZdS )
WhateverIOz!StringIO that takes bytes or str.Nc                 O   s(   t | t|tr| n|f|| d S r$   )	_SIO_initr   bytesdecode)selfr/   arK   r   r   r   __init__   s    zWhateverIO.__init__c                 C   s    t | t|tr| n| d S r$   )
_SIO_writer   rh   ri   )rj   datar   r   r   write   s    zWhateverIO.write)N)__name__
__module____qualname____doc__rl   ro   r   r   r   r   rf      s   
rf   )r    )r    r#   )r#   )r#   )r0   )r2   )r   r#   )r?   r2   )r   )rE   rE   r#   ),rs   iorecollections.abcr   	functoolsr   pprintr   textwrapr   typingr   r   r	   r
   __all__striprU   compileZ	RE_FORMATr   r   r   r   r   r   r   r   r   r   r   r   r   rP   r   r`   r_   StringIOro   rm   rl   rg   rf   r   r   r   r   <module>   s>   












