
    ^jC                        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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      Z e       Z G d de      Z G d	 d
      Z G d d      Zd Zd Zd Zd ZefdZd ZddZd Z d Z!d Z"d Z#ddZ$y)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                       e Zd Zd Zy)_Unsetc                      y)Nz<UNSET> selfs    Q/opt/ringagent/.cad-venv/lib/python3.12/site-packages/matplotlib/_api/__init__.py__repr__z_Unset.__repr__!   s        N)__name__
__module____qualname__r   r   r   r   r   r       s    r   r   c                       e Zd ZdZy)UnsupportedErrorz
    Raised on inherited methods if the child class does not support the functionality
    of the base class.

    See `.unsupported_method` for details.
    N)r   r   r   __doc__r   r   r   r   r   &   s    r   r   c                   "    e Zd ZdZdddZd Zy)unsupported_methoda  
    Descriptor that creates a method raising `.UnsupportedError`.

    Historically, we have quite a few cases of inheritance hierarchies that do not
    fully respect the Liskov Substitution Principle, e.g. Axes and Artist. Some of
    the methods of a base class may not be implemented in the child class. In that case,
    we override the method in the child class to raise `.UnsupportedError`.

    Use in a class body to mark inherited methods as unsupported::

        class Axes3D(Axes):
            twinx = _api.unsupported_method()

    Calling ``Axes3D().twinx()`` will raise
    "UnsupportedError: Axes3D does not support 'twinx'."

    Parameters
    ----------
    append_message : str
        Optional additional text to be appended to the error message.
    Nappend_messagec                    || _         y Nr   )r   r   s     r   __init__zunsupported_method.__init__E   s
    ,r   c                     |j                    d| d| j                  rd| j                  z   z  fd}||_         |j                   d| |_        |j                  |_        t	        |||       y )Nz does not support 'z'. c                     t              r!   )r   )r   argskwargsmessages      r   methodz/unsupported_method.__set_name__.<locals>.methodM   s    "7++r   .)r   r   r   r   setattr)r   ownernamer)   r(   s       @r   __set_name__zunsupported_method.__set_name__H   s{    ^^$$7vR@sT0000G	, !&!3!3 4AdV<!,,tV$r   )r   r   r   r   r"   r.   r   r   r   r   r   /   s    * *. -%r   r   c                   .    e Zd ZdZddZd Zed        Zy)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                 Z    || _         ||t        d      || _        || _        || _        y )Nz#classproperty only implements fget.)_fget
ValueErrorfsetfdel_doc)r   fgetr4   r5   docs        r   r"   zclassproperty.__init__g   s5    
t/BCC			r   c                 $    | j                  |      S r!   r2   )r   instancer,   s      r   __get__zclassproperty.__get__p   s    zz%  r   c                     | j                   S r!   r:   r   s    r   r7   zclassproperty.fgets   s    zzr   )NNN)r   r   r   r   r"   r<   propertyr7   r   r   r   r0   r0   V   s%     !  r   r0   c                   t        d      t        | t               r| fn| fnt        fd| D              } fd}|j                         D ]  \  }}t        ||       rg t	        ||       }d|v r"|j                  d       |j                  d       t        dj                  |t        |      dkD  rdj                  |dd       d	z   |d   z   n|d
    |t        |                         y)a3  
    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   *   K   | ]
  }|n|  y wr!   r   ).0tp	none_types     r   	<genexpr>z#check_isinstance.<locals>.<genexpr>   s     Cr
92Cs   c                 |    | u rdS | j                   dk(  r| j                  S | j                    d| j                   S )NNonebuiltinsr*   )r   r   )rB   rC   s    r   	type_namez#check_isinstance.<locals>.type_name   sD    	/ 	;(*(CR__	;a'89	;r   rF   z({!r} must be an instance of {}, not a {}r   , z or r   )type
isinstancetupleitemsmapremoveappend	TypeErrorformatlenjoin)typesr'   rH   kvnamesrC   s         @r   check_isinstancerZ   {   s     T
I#E40eX"]i\CUCC 
;
  )1!U#,c)U+,EV$V$:AA5zA~ IIeCRj)F2U2Y>+08d1g&	() ))r   c                 \   t        |      dkD  rst        d |g|D              r^t        j                  ||d      }t        |      xdk(  r d}nUdk(  r
d|d   d	}nG	 d
dj	                  t        t        |             d	}n"ddj	                  t        t        |             }|d|  d| S )a  
    Generate an error message that a potential setting is not an acceptable value.

    If the acceptable values are all strings, and sufficiently large, then add just a
    few suggestions to the end of the message. Otherwise list the supported values.

    Parameters
    ----------
    name : str
        The name of the setting, keyword argument, etc. to generate the message for.
    potential
        The potential value from the user that is not a valid choice.
    values : iterable
        Sequence of values to check on.
       c              3   <   K   | ]  }t        |t                y wr!   )rL   str)rA   rX   s     r   rD   z,list_suggestion_error_msg.<locals>.<genexpr>   s     Paz!S1Ps   g      ?)cutoffr    r   z Did you mean: ?z Did you mean one of: rI   z Supported values are z is not a valid value for r*   )rT   alldifflibget_close_matchesrU   rO   repr)r-   	potentialvaluesbest
suggestions        r   list_suggestion_error_msgrj      s      6{Q3PI;O;OPP((F3G$i
.tAwk;
5diiD$6P5QQRS
-diiD&8I.J-KL
]4TF!J<HHr   c                    |st        d      |j                         D ]"  \  }}	 || v }|rt        t        |||              y# t        $ r d}Y (w xY w)a|  
    For each *key, value* pair in *kwargs*, check that *value* is in *values*;
    if not, raise an appropriate ValueError.

    Parameters
    ----------
    values : iterable
        Sequence of values to check on.

        Note: All values must support == comparisons.
        This means in particular the entries must not be numpy arrays.
    **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No argument to check!FN)rR   rN   r3   rj   )rg   r'   keyvalexistss        r   check_in_listro      sn    0 /00LLN JS
	F]F 6sCHIIJ  	 F	s   AAAc          
      &   |j                         D ]  \  }}|j                  }t        |      t        |       k7  st        d t	        ||       D              sFt        t        j                  dd t        j                         D                    }dj                  | ddd   D cg c]  }|t        |      n
t        |       c}ddd         }t        |       dk(  r|dz  }t        |d	t        |        d
| d|j                          yc c}w )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              3   8   K   | ]  \  }}||k7  xr |d u  y wr!   r   )rA   sts      r   rD   zcheck_shape.<locals>.<genexpr>   s$     SDAqqAv/!4-/Ss   NMLKJIHc              3   &   K   | ]	  }d |   yw)DNr   )rA   is     r   rD   zcheck_shape.<locals>.<genexpr>   s     4Q1QC4s   rI   NrJ   r   ,z	 must be zD with shape (z), but your input has shape )rN   shaperT   anyzipiter	itertoolschaincountrU   r^   nextr3   )ry   r'   rW   rX   
data_shape
dim_labelsn
text_shapes           r   check_shaper      s      1WW

Os5z)SC
E<RSSioo4)//"346 7J -24R4[$:() /0mCFjAQ$Q $::>B$$@ AJ5zQc!
%yUN:, G,,-GG96 $:s   $D
c          	          t        |      dk7  rt        d      |j                         \  \  }}	 | |   S # t        $ r#  |t	        ||| j                                     dw xY w)aE  
    *kwargs* must consist of a single *key, value* pair.  If *key* is in
    *mapping*, return ``mapping[value]``; else, raise an appropriate
    ValueError.

    Parameters
    ----------
    _error_cls :
        Class of error to raise.

    Examples
    --------
    >>> _api.getitem_checked({"foo": "bar"}, arg=arg)
    r   z/getitem_checked takes a single keyword argumentN)rT   r3   rN   KeyErrorrj   keys)mapping
_error_clsr'   rW   rX   s        r   getitem_checkedr   	  sk     6{aJKKllnGFQTqz T21aHItSTs	   5 ,A!c                       j                   dk(  sJ t               j                         D ci c]  \  }}t        |t              r|| c}}         t
        j                   fd       }|S c c}}w )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                 j    | v r|    j                        S t        dj                  d|       )Nzmodule z has no attribute )r<   AttributeErrorr   )r-   clsr;   propss    r   r   z+caching_module_getattr.<locals>.__getattr__:  sD    5=;&&x00cnn''9$BD 	Dr   )r   varsrN   rL   r>   	functoolscache)r   r-   propr   r;   r   s   `   @@r   caching_module_getattrr   !  sw    & <<=(((*.s)//*; ,JD$4* 4Z ,EuH__D D ,s   A5c                 $   t        j                  t        |       S fd}| j                         D ]k  \  }}d}dD ]O  }||z   t	              v sd}|D ]5  } |||z         }||z   |_        d||z    d|_        t        ||z   |       7 Q |r_t        d|       | j                         D ci c]  \  }}|D ]  }||  }	}}}d }
t        d	i       } |
|       |
|	      z  }|rt        d
|       i ||	_        S c c}}}w )aQ  
    Class decorator for defining property aliases.

    Use as ::

        @_api.define_aliases({"property": ["alias", ...], ...})
        class C: ...

    For each property, if the corresponding ``get_property`` is defined in the
    class so far, an alias named ``get_alias`` will be defined; the same will
    be done for setters.  If neither the getter nor the setter exists, an
    exception will be raised.

    The alias map is stored as the ``_alias_to_prop`` attribute under the format
    ``{"alias": "property", ...}` on the class, and can be used by
    `.normalize_kwargs`.
    c                 X     t        j                  t                      fd       }|S )Nc                 (     t        |       |i |S r!   )getattr)r   r&   r'   r-   s      r   r)   z2define_aliases.<locals>.make_alias.<locals>.methodZ  s    &74&777r   )r   wrapsr   )r-   r)   r   s   ` r   
make_aliasz"define_aliases.<locals>.make_aliasY  s*    	d+	,	8 
-	8r   F)get_set_TzAlias for `z`.z%Neither getter nor setter exists for c                 F    h | j                         | j                         S r!   )r   rg   )ds    r   get_aliased_and_aliasesz/define_aliases.<locals>.get_aliased_and_aliasesp  s    ''AHHJ''r   _alias_to_propz2Parent class already defines conflicting aliases: )r   partialdefine_aliasesrN   r   r   r   r+   r3   r   NotImplementedErrorr   )alias_dr   r   r   aliasesrn   prefixaliasr)   alias_to_propr   preexisting_aliasesconflictings    `           r   r   r   D  s   $ {  99 ! Bg& 	9F}S	)$ 9E'6F&,unFO'26D=/%DFNC%8	9	9 7x@B BB *1O O%ggO=BtOOM O( "#'7<*+>?,];<K!@NP 	PA/A=ACJOs   5Dc                     t        |       D ]  \  }}	  ||i |c S  y# t        $ r |t        |       dz
  k(  r Y 0w xY w)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)	enumeraterR   rT   )funcsr&   r'   rw   funcs        r   select_matching_signaturer   ~  s[    X U# 4	(((  	CJN" #	s   ==c                 *    t        |  d| d| d      S )zEGenerate a TypeError to be raised by function calls with wrong arity.z	() takes z positional arguments but z were given)rR   )r-   takesgivens      r   nargs_errorr     s(    vYug-Gwk+ , ,r   c                 l    t        |t              st        t        |            }t	        |  d| d      S )aL  
    Generate a TypeError to be raised by function calls with wrong kwarg.

    Parameters
    ----------
    name : str
        The name of the calling function.
    kw : str or Iterable[str]
        Either the invalid keyword argument name, or an iterable yielding
        invalid keyword arguments (e.g., a ``kwargs`` dict).
    z'() got an unexpected keyword argument '')rL   r^   r   r|   rR   )r-   kws     r   kwarg_errorr     s4     b#$r(^vDRDJKKr   c              #   h   K   |  | j                         D ]  }t        |      E d{     y7 w)z8Yield *cls* and direct and indirect subclasses of *cls*.N)__subclasses__recursive_subclasses)r   subclss     r   r   r     s4     
I$$& 0'///0/s   &202c                    i }t         j                  dd dk\  rFt        j                  t              j
                  d   }t        |dz        t        |dz        f|d<   n{t        j                         }t        j                  d      D ]N  }|||d<    nEt        j                  d	|j                  j                  d
d            s||d<    n|j                  }P ~t        j                   | |fi | y)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.).
    N   )      
matplotlibmpl_toolkitsskip_file_prefixesr   
stacklevelz-\A(matplotlib|mpl_toolkits)(\Z|\.(?!tests\.))r   r`   )sysversion_infopathlibPath__file__parentsr^   	_getframer}   r   rematch	f_globalsgetf_backwarningswarn)r(   categoryr'   basedirframer   s         r   warn_externalr     s     F
w&,,x(003(+Gl,B(C(+Gn,D(E(G#$ #//!, 
	!J}'1|$88L!OO//
B?A (2|$LLE
	! MM'8.v.r   r!   )%r   rc   r   r}   r   r   r   r   deprecationr   r   r   r   r   r	   r
   r   r   r   UNSETRuntimeErrorr   r   r0   rZ   rj   ro   r   r3   r   r   r   r   r   r   r   r   r   r   r   <module>r      s   
     	 
 " " "  	| $% $%N J )FI<'JT F ,6 T0 F7t1h,L"0/r   