
    .Ph                    j    d Z ddlmZ ddlmZ erddlmZ  G d de          Z G d de          Zd	S )
z#
meta.py

Some useful metaclasses.
    )annotations)TYPE_CHECKING)Anyc                  &    e Zd ZU dZded<   ddZdS )LeafClassesMetaa  
    A metaclass for classes that keeps track of all of them that
    aren't base classes.

    >>> Parent = LeafClassesMeta('MyParentClass', (), {})
    >>> Parent in Parent._leaf_classes
    True
    >>> Child = LeafClassesMeta('MyChildClass', (Parent,), {})
    >>> Child in Parent._leaf_classes
    True
    >>> Parent in Parent._leaf_classes
    False

    >>> Other = LeafClassesMeta('OtherClass', (), {})
    >>> Parent in Other._leaf_classes
    False
    >>> len(Other._leaf_classes)
    1
    zset[type[Any]]_leaf_classesnamestrbasestuple[type[object], ...]attrsdict[str, object]returnNonec                    t          | d          st                      | _        t          | d          }|                    |            |t          |          z  }d S )Nr   )hasattrsetr   getattradd)clsr	   r   r   leaf_classess        S/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/jaraco/classes/meta.py__init__zLeafClassesMeta.__init__&   sY     sO,, 	& #CsO44E

"    N)r	   r
   r   r   r   r   r   r   )__name__
__module____qualname____doc____annotations__r    r   r   r   r      sB          ( "!!!# # # # # #r   r   c                  (     e Zd ZdZdZd fdZ xZS )TagRegisteredaY  
    As classes of this metaclass are created, they keep a registry in the
    base class of all classes by a class attribute, indicated by attr_name.

    >>> FooObject = TagRegistered('FooObject', (), dict(tag='foo'))
    >>> FooObject._registry['foo'] is FooObject
    True
    >>> BarObject = TagRegistered('Barobject', (FooObject,), dict(tag='bar'))
    >>> FooObject._registry is BarObject._registry
    True
    >>> len(FooObject._registry)
    2

    '...' below should be 'jaraco.classes' but for pytest-dev/pytest#3396
    >>> FooObject._registry['bar']
    <class '....meta.Barobject'>
    tagr	   r
   r   r   	namespacer   r   r   c                    t          t          |                               |||           t          | d          si | _        | j        }t          | |j        d           }|r| | j        |<   d S d S )N	_registry)superr"   r   r   r&   	__class__r   	attr_name)r   r	   r   r$   metaattrr(   s         r   r   zTagRegistered.__init__I   s~     	mS!!**4	BBBsK(( 	CM}sDND11 	&"%CM$	& 	&r   )r	   r
   r   r   r$   r   r   r   )r   r   r   r   r)   r   __classcell__)r(   s   @r   r"   r"   4   sN         $ I& & & & & & & & & &r   r"   N)	r   
__future__r   typingr   r   typer   r"   r    r   r   <module>r0      s     # " " " " "             "# "# "# "# "#d "# "# "#J!& !& !& !& !&D !& !& !& !& !&r   