B
    Jd:(                 @   s   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mZmZm	Z	m
Z
mZmZmZmZmZ G dd dZdd Zd	d
ddZdd Zdd Zdd Zdd ZdddZdS )a+  
Helper functions for managing the Matplotlib API.

This documentation is only relevant for Matplotlib developers, not for users.

.. warning::

    This module and its submodules are for internal use only.  Do not use them
    in your own code.  We may change the API at any time with no warning.

    N   )	
deprecatedwarn_deprecatedrename_parameterdelete_parametermake_keyword_onlydeprecate_method_overridedeprecate_privatize_attribute'suppress_matplotlib_deprecation_warningMatplotlibDeprecationWarningc               @   s.   e Zd ZdZd	ddZdd Zedd ZdS )
classpropertya$  
    Like `property`, but also triggers on access via the class, and it is the
    *class* that's passed as argument.

    Examples
    --------
    ::

        class C:
            @classproperty
            def foo(cls):
                return cls.__name__

        assert C.foo == "C"
    Nc             C   s4   || _ |d k	s|d k	rtd|| _|| _|| _d S )Nz#classproperty only implements fget.)_fget
ValueErrorfsetfdel_doc)selffgetr   r   doc r   J/var/www/html/venv/lib/python3.7/site-packages/matplotlib/_api/__init__.py__init__,   s    zclassproperty.__init__c             C   s
   |  |S )N)r   )r   instanceownerr   r   r   __get__5   s    zclassproperty.__get__c             C   s   | j S )N)r   )r   r   r   r   r   8   s    zclassproperty.fget)NNN)__name__
__module____qualname____doc__r   r   propertyr   r   r   r   r   r      s   
	r   c          
      s   | }t d t|t r|fn"|dkr* fnt fdd|D } fdd}x| D ]\}}t||sVt||}d|kr|d |d td|t	|dkrd	
|dd
 d |d
  n|d |t |qVW dS )a5  
    For each *key, value* pair in *kwargs*, check that *value* is an instance
    of one of *_types*; if not, raise an appropriate TypeError.

    As a special case, a ``None`` entry in *_types* is treated as NoneType.

    Examples
    --------
    >>> _api.check_isinstance((SomeClass, None), arg=arg)
    Nc             3   s   | ]}|d kr n|V  qd S )Nr   ).0tp)	none_typer   r   	<genexpr>P   s    z#check_isinstance.<locals>.<genexpr>c                s.   |  krdS | j dkr| jS | j  d| j S )NNonebuiltins.)r   r   )r!   )r"   r   r   	type_nameR   s    z#check_isinstance.<locals>.type_namer$   z({!r} must be an instance of {}, not a {}r   z, z or r   )type
isinstancetupleitemsmapremoveappend	TypeErrorformatlenjoin)_typeskwargstypesr'   kvnamesr   )r"   r   check_isinstanceA   s"    


0r:   T)_print_supported_valuesc            K   sZ   | }xP|  D ]D\}}||kr|d| }|rJ|ddtt| 7 }t|qW dS )aC  
    For each *key, value* pair in *kwargs*, check that *value* is in *_values*.

    Parameters
    ----------
    _values : iterable
        Sequence of values to check on.
    _print_supported_values : bool, default: True
        Whether to print *_values* when raising ValueError.
    **kwargs : dict
        *key, value* pairs as keyword arguments to find in *_values*.

    Raises
    ------
    ValueError
        If any *value* in *kwargs* is not found in *_values*.

    Examples
    --------
    >>> _api.check_in_list(["foo", "bar"], arg=arg, other_arg=other_arg)
    z is not a valid value for z; supported values are z, N)r,   r3   r-   reprr   )Z_valuesr;   r5   valueskeyvalmsgr   r   r   check_in_liste   s    rA   c          
      s   | }x|  D ]\}}|j}t|t|ksDtdd t||D rttddd t D  d	 fdd|D }t
|dt| d| d	|j d
qW dS )a  
    For each *key, value* pair in *kwargs*, check that *value* has the shape
    *_shape*, if not, raise an appropriate ValueError.

    *None* in the shape is treated as a "free" size that can have any length.
    e.g. (None, 2) -> (N, 2)

    The values checked must be numpy arrays.

    Examples
    --------
    To check for (N, 2) shaped arrays

    >>> _api.check_shape((None, 2), arg=arg, other_arg=other_arg)
    c             s   s   | ]\}}||d gkV  qd S )Nr   )r    tsr   r   r   r#      s   zcheck_shape.<locals>.<genexpr>ZMNLIJKLHc             s   s   | ]}d | V  qdS )DNr   )r    ir   r   r   r#      s    z, c             3   s&   | ]}|d k	rt |nt V  qd S )N)strnext)r    n)
dim_labelsr   r   r#      s   z	 must be zD with shape (z). Your input has shape r&   N)r,   shaper2   anyzipiter	itertoolschaincountr3   r   )_shaper5   Ztarget_shaper7   r8   Z
data_shapeZ
text_shaper   )rI   r   check_shape   s    
rR   c             K   sh   | }t |dkrtd| \\}}y|| S  tk
rb   td||dtt|dY nX dS )z
    *kwargs* must consist of a single *key, value* pair.  If *key* is in
    *_mapping*, return ``_mapping[value]``; else, raise an appropriate
    ValueError.

    Examples
    --------
    >>> _api.check_getitem({"foo": "bar"}, arg=arg)
    r   z-check_getitem takes a single keyword argumentz9{!r} is not a valid value for {}; supported values are {}z, N)r2   r   r,   KeyErrorr1   r3   r-   r<   )_mappingr5   mappingr7   r8   r   r   r   check_getitem   s    
rV   c                sH    j dkstdd t  D   td fdd}|S )a
  
    Helper decorator for implementing module-level ``__getattr__`` as a class.

    This decorator must be used at the module toplevel as follows::

        @caching_module_getattr
        class __getattr__:  # The class *must* be named ``__getattr__``.
            @property  # Only properties are taken into account.
            def name(self): ...

    The ``__getattr__`` class will be replaced by a ``__getattr__``
    function such that trying to access ``name`` on the module will
    resolve the corresponding property (which may be decorated e.g. with
    ``_api.deprecated`` for deprecating module globals).  The properties are
    all implicitly cached.  Moreover, a suitable AttributeError is generated
    and raised if no property with the given name exists.
    __getattr__c             S   s    i | ]\}}t |tr||qS r   )r*   r   )r    namepropr   r   r   
<dictcomp>   s    z*caching_module_getattr.<locals>.<dictcomp>Nc                s0   | kr|   S td jd| d S )Nzmodule z has no attribute )r   AttributeErrorr   )rX   )clsr   propsr   r   rW      s    z+caching_module_getattr.<locals>.__getattr__)r   AssertionErrorvarsr,   	functools	lru_cache)r\   rW   r   )r\   r   r]   r   caching_module_getattr   s
    rb   c          	   O   sL   xFt | D ]:\}}y
|||S  tk
rB   |t| d kr> Y q
X q
W dS )a  
    Select and call the function that accepts ``*args, **kwargs``.

    *funcs* is a list of functions which should not raise any exception (other
    than `TypeError` if the arguments passed do not match their signature).

    `select_matching_signature` tries to call each of the functions in *funcs*
    with ``*args, **kwargs`` (in the order in which they are given).  Calls
    that fail with a `TypeError` are silently skipped.  As soon as a call
    succeeds, `select_matching_signature` returns its return value.  If no
    function accepts ``*args, **kwargs``, then the `TypeError` raised by the
    last failing call is re-raised.

    Callers should normally make sure that any ``*args, **kwargs`` can only
    bind a single *func* (to avoid any ambiguity), although this is not checked
    by `select_matching_signature`.

    Notes
    -----
    `select_matching_signature` is intended to help implementing
    signature-overloaded functions.  In general, such functions should be
    avoided, except for back-compatibility concerns.  A typical use pattern is
    ::

        def my_func(*args, **kwargs):
            params = select_matching_signature(
                [lambda old1, old2: locals(), lambda new: locals()],
                *args, **kwargs)
            if "old1" in params:
                warn_deprecated(...)
                old1, old2 = params.values()  # note that locals() is ordered.
            else:
                new, = params.values()
            # do things with params

    which allows *my_func* to be called either with two parameters (*old1* and
    *old2*) or a single one (*new*).  Note that the new signature is given
    last, so that callers get a `TypeError` corresponding to the new signature
    if the arguments they passed in do not match any signature.
    r   N)	enumerater0   r2   )funcsargsr5   rE   funcr   r   r   select_matching_signature   s    ,
rg   c             C   sV   t  }x:tdD ],}|dkr"P td|jdds:P |j}qW t	
| || dS )a4  
    `warnings.warn` wrapper that sets *stacklevel* to "outside Matplotlib".

    The original emitter of the warning can be obtained by patching this
    function back to `warnings.warn`, i.e. ``_api.warn_external =
    warnings.warn`` (or ``functools.partial(warnings.warn, stacklevel=2)``,
    etc.).
    r   Nz-\A(matplotlib|mpl_toolkits)(\Z|\.(?!tests\.))r    )sys	_getframerN   rP   rematch	f_globalsgetf_backwarningswarn)messagecategoryframe
stacklevelr   r   r   warn_external  s    	
rv   )N)r   r`   rN   rk   ri   rp   deprecationr   r   r   r   r   r   r	   r
   r   r   r:   rA   rR   rV   rb   rg   rv   r   r   r   r   <module>   s   ,&$'#4