U
    \	a                     @   s   d 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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   </tmp/pip-unpacked-wheel-wjyw_3jo/matplotlib/_api/__init__.py__init__+   s    zclassproperty.__init__c                 C   s
   |  |S Nr   )r   instanceownerr   r   r   __get__4   s    zclassproperty.__get__c                 C   s   | j S r   r   )r   r   r   r   r   7   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}| D ]\}}t||sTt||}d|kr|d |d td|t	|dkrd	
|dd
 d |d
  n|d |t |qTd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 r   r   ).0tpZ	none_typer   r   	<genexpr>O   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_nameQ   s    z#check_isinstance.<locals>.type_namer&   z({!r} must be an instance of {}, not a {}r   , z or r   )type
isinstancetupleitemsmapremoveappend	TypeErrorformatlenjoin)_typeskwargstypesr)   kvnamesr   r$   r   check_isinstance@   s,    



 
r=   T)_print_supported_valuesc                K   s^   | }|  D ]L\}}||kr|rFt|d| ddtt| qt|d| q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 r*   N)r/   r   r6   r0   repr)Z_valuesr>   r8   valueskeyvalr   r   r   check_in_listd   s    rC   c              
      s   | }|  D ]\}}|j}t|t|ksBt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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 fkV  qd S r   r   )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     r*   c                 3   s&   | ]}|d k	rt |nt V  qd S r   )strnext)r"   nZ
dim_labelsr   r   r%      s   
z	 must be zD with shape (z). Your input has shape r(   N)r/   shaper5   anyzipiter	itertoolschaincountr6   r   )Z_shaper8   Ztarget_shaper:   r;   Z
data_shapeZ
text_shaper   rK   r   check_shape   s      rS   c                 K   sj   | }t |dkrtd| \\}}z
|| W S  tk
rd   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 {}r*   N)r5   r   r/   KeyErrorr4   r6   r0   r?   )_mappingr8   mappingr:   r;   r   r   r   check_getitem   s     

  rW   c                 C   sV   t  }tdD ]0}|dkr" qDtd|jdds< qD|j}q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	_getframerP   rR   rematch	f_globalsgetf_backwarningswarn)messagecategoryframe
stacklevelr   r   r   warn_external   s    	rf   )N)r    rP   r[   rY   r`   deprecationr   r   r   r   r   r   r	   r
   r   r   r=   rC   rS   rW   rf   r   r   r   r   <module>   s   ,&$!'