U
    kuf                     @  s   d dl mZ d dlZd dlZd dlZd dlmZ dddddddd	d
dZdddddZdddddZ	ddddddddZ
dddddZdS )    )annotationsN)AnyFz
str | Noner   boolstr)articlevaluenameverbosecapitalreturnc                 C  s  t | tr|  } t|s(t|j}n|j}|r>t|| }| dks\| dkrDt|sD|dk	r| d| }| dk	rt|d|S |S nd}t|r|j}nlt |t	j
r|j}d}nTt |t	jr|jj}d}n:t|jtjtjfkrdtt| }d}nt|}d}|r t|| }|r0|d}t| ||||dS n:| d	ksX| dkrr| dkrf|S t|d|S td
|  dS )a  Return string that describes a value

    Parameters
    ----------
    article : str or None
        A definite or indefinite article. If the article is
        indefinite (i.e. "a" or "an") the appropriate one
        will be inferred. Thus, the arguments of ``describe``
        can themselves represent what the resulting string
        will actually look like. If None, then no article
        will be prepended to the result. For non-articled
        description, values that are instances are treated
        definitely, while classes are handled indefinitely.
    value : any
        The value which will be named.
    name : str or None (default: None)
        Only applies when ``article`` is "the" - this
        ``name`` is a definite reference to the value.
        By default one will be inferred from the value's
        type and repr methods.
    verbose : bool (default: False)
        Whether the name should be concise or verbose. When
        possible, verbose names include the module, and/or
        class name where an object was defined.
    capital : bool (default: False)
        Whether the first letter of the article should
        be capitalized or not. By default it is not.

    Examples
    --------
    Indefinite description:

    >>> describe("a", object())
    'an object'
    >>> describe("a", object)
    'an object'
    >>> describe("a", type(object))
    'a type'

    Definite description:

    >>> describe("the", object())
    "the object at '...'"
    >>> describe("the", object)
    'the object object'
    >>> describe("the", type(object))
    'the type type'

    Definitely named description:

    >>> describe("the", object(), "I made")
    'the object I made'
    >>> describe("the", object, "I will use")
    'the object I will use'
    ZtheN TFzat '%s'z'')r   r	   r
   )aZanzAThe 'article' argument should be 'the', 'a', 'an', or None not %r)
isinstancer   lowerinspectisclasstype__name___prefixadd_articletypesFunctionType
MethodType__func____repr__objecthexidreprjoindescribe
ValueError)r   r   r   r	   r
   typenameresultZ	tick_wrap r$   @/tmp/pip-unpacked-wheel-utpcgctl/traitlets/utils/descriptions.pyr    	   sT    >




r    )r   r   c                 C  sR   t | tjr"td | jddd }n,t| }|d k	rJ|jdkrJ|jd }nd}|S )NT)r	   .builtins )r   r   r   r    __self__r   	getmoduler   )r   r   moduler$   r$   r%   r   z   s    
r   c                 C  s$   t | rt| jS tt| S dS )zsReturns a string of the value's type with an indefinite article.

    For example 'an Image' or 'a PlotValue'.
    N)r   r   r   r   class_ofr   )r   r$   r$   r%   r,      s    

r,   )r   definiter
   r   c                 C  sj   |rd|  }n8t dd| }|dd  dkr>d|  }nd|  }|rb|d	  |dd  S |S dS )
a  Returns the string with a prepended article.

    The input does not need to begin with a character.

    Parameters
    ----------
    name : str
        Name to which to prepend an article
    definite : bool (default: False)
        Whether the article is definite or not.
        Indefinite articles being 'a' and 'an',
        while 'the' is definite.
    capital : bool (default: False)
        Whether the added article should have
        its first letter capitalized or not.
    zthe z[\W_]+r(   N   Zaeiouzan za r   )recompilesubr   upper)r   r-   r
   r#   Zfirst_lettersr$   r$   r%   r      s    

r   )objr   c                 C  s   t | }| d|S )z]Return a string representation of a value and its type for readable

    error messages.
    r   )r   )r3   Zthe_typer$   r$   r%   	repr_type   s    r4   )NFF)FF)
__future__r   r   r/   r   typingr   r    r   r,   r   r4   r$   r$   r$   r%   <module>   s      q