
    Sf>              	          d Z ddlmZmZ g ZddlmZ ddlmZ ddl	m
Z
mZmZ  e            Z ee e                      Z G d de          Z G d d	e          Z G d
 d edefi                     Z G d de          Z G d de          Z G d de          Z G d de          Zd Z G d de          Z G d de          ZdS )zi
Symbolic constant support, including collections and constants with text,
numeric, and bit flag values.
    )divisionabsolute_import)partial)count)and_or_xorc                   <    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	S )
	_Constanta  
    @ivar _index: A C{int} allocated from a shared counter in order to keep
        track of the order in which L{_Constant}s are instantiated.

    @ivar name: A C{str} giving the name of this constant; only set once the
        constant is initialized by L{_ConstantsContainer}.

    @ivar _container: The L{_ConstantsContainer} subclass this constant belongs
        to; C{None} until the constant is initialized by that subclass.
    c                 :    d | _         t                      | _        d S N)
_container_constantOrder_indexselfs    G/var/www/html/env/lib/python3.11/site-packages/constantly/_constants.py__init__z_Constant.__init__!   s    $&&    c                 2    d| j         j        d| j        dS )zq
        Return text identifying both which constant this is and which
        collection it belongs to.
        <=>)r   __name__namer   s    r   __repr__z_Constant.__repr__&   s"     
 !O444diii@@r   c                 z    t          || j                  r| j        |j        k    st          S | j        |j        k     S )aC  
        Implements C{<}.  Order is defined by instantiation order.

        @param other: An object.

        @return: C{NotImplemented} if C{other} is not a constant belonging to
            the same container as this constant, C{True} if this constant is
            defined before C{other}, otherwise C{False}.
        
isinstance	__class__r   NotImplementedr   r   others     r   __lt__z_Constant.__lt__.   =     5$.11	"5#333!!{U\))r   c                     t          || j                  r| j        |j        k    st          S | |u p| j        |j        k     S )aP  
        Implements C{<=}.  Order is defined by instantiation order.

        @param other: An object.

        @return: C{NotImplemented} if C{other} is not a constant belonging to
            the same container as this constant, C{True} if this constant is
            defined before or equal to C{other}, otherwise C{False}.
        r   r"   s     r   __le__z_Constant.__le__@   F     5$.11	"5#333!!u}:el ::r   c                 z    t          || j                  r| j        |j        k    st          S | j        |j        k    S )aB  
        Implements C{>}.  Order is defined by instantiation order.

        @param other: An object.

        @return: C{NotImplemented} if C{other} is not a constant belonging to
            the same container as this constant, C{True} if this constant is
            defined after C{other}, otherwise C{False}.
        r   r"   s     r   __gt__z_Constant.__gt__R   r%   r   c                     t          || j                  r| j        |j        k    st          S | |u p| j        |j        k    S )aO  
        Implements C{>=}.  Order is defined by instantiation order.

        @param other: An object.

        @return: C{NotImplemented} if C{other} is not a constant belonging to
            the same container as this constant, C{True} if this constant is
            defined after or equal to C{other}, otherwise C{False}.
        r   r"   s     r   __ge__z_Constant.__ge__d   r(   r   c                 "    || _         || _        dS )ao  
        Complete the initialization of this L{_Constant}.

        @param container: The L{_ConstantsContainer} subclass this constant is
            part of.

        @param name: The name of this constant in its container.

        @param value: The value of this constant; not used, as named constants
            have no value apart from their identity.
        N)r   r   )r   	containerr   values       r   _realizez_Constant._realizev   s     $			r   N)r   
__module____qualname____doc__r   r   r$   r'   r*   r,   r0    r   r   r   r      s        	 	' ' '
A A A* * *$; ; ;$* * *$; ; ;$    r   r   c                   "     e Zd ZdZ fdZ xZS )_ConstantsContainerTypeza
    L{_ConstantsContainerType} is a metaclass for creating constants container
    classes.
    c                    t          t          |                               | |||          }t          |dd          }||S g }|                                D ]X\  }}t          ||j                  r>|j        t          d|d|j	                  |
                    |j        ||f           Yi }t          |          D ]8\  }	}
}|                    |
|          }|                    ||
|           |||
<   9||_        |S )a  
        Create a new constants container class.

        If C{attributes} includes a value of C{None} for the C{"_constantType"}
        key, the new class will not be initialized as a constants container and
        it will behave as a normal class.

        @param name: The name of the container class.
        @type name: L{str}

        @param bases: A tuple of the base classes for the new container class.
        @type bases: L{tuple} of L{_ConstantsContainerType} instances

        @param attributes: The attributes of the new container class, including
            any constants it is to contain.
        @type attributes: L{dict}
        _constantTypeNzCannot use z! as the value of an attribute on )superr6   __new__getattritemsr   r8   r   
ValueErrorr   appendr   sorted_constantFactoryr0   _enumerants)r   r   bases
attributesclsconstantType	constants
descriptor
enumerantsindex	enumerantr/   r    s               r   r:   z_ConstantsContainerType.__new__   sD   $ +T22::$z+ +
 sOT::J	","2"2"4"4 	H 	HT:*c&788 H(4$*&JJ67 7 7   *"3T:!FGGG
.4Y.?.? 	/ 	/*UIz((J??EY666$.Jy!!
 %
r   )r   r1   r2   r3   r:   __classcell__)r    s   @r   r6   r6      sB         / / / / / / / / /r   r6   c                   ^    e Zd ZdZdZd Zed             Zed             Zed             Z	dS )_ConstantsContainera  
    L{_ConstantsContainer} is a class with attributes used as symbolic
    constants.  It is up to subclasses to specify what kind of constants are
    allowed.

    @cvar _constantType: Specified by a L{_ConstantsContainer} subclass to
        specify the type of constants allowed by that subclass.

    @cvar _enumerants: A C{dict} mapping the names of constants (eg
        L{NamedConstant} instances) found in the class definition to those
        instances.
    Nc                 0    t          | j        d          )z
        Classes representing constants containers are not intended to be
        instantiated.

        The class object itself is used directly.
        z may not be instantiated.)	TypeErrorr   )rD   s    r   r:   z_ConstantsContainer.__new__   s     GHHHr   c                     t           S )a  
        Construct the value for a new constant to add to this container.

        @param name: The name of the constant to create.

        @param descriptor: An instance of a L{_Constant} subclass (eg
            L{NamedConstant}) which is assigned to C{name}.

        @return: L{NamedConstant} instances have no value apart from identity,
            so return a meaningless dummy value.
        )_unspecified)rD   r   rG   s      r   r@   z$_ConstantsContainer._constantFactory   s
     r   c                 R    || j         v rt          | |          S t          |          )a  
        Retrieve a constant by its name or raise a C{ValueError} if there is no
        constant associated with that name.

        @param name: A C{str} giving the name of one of the constants defined
            by C{cls}.

        @raise ValueError: If C{name} is not the name of one of the constants
            defined by C{cls}.

        @return: The L{NamedConstant} associated with C{name}.
        )rA   r;   r=   )rD   r   s     r   lookupByNamez _ConstantsContainer.lookupByName   s/     3?""3%%%r   c                 r    | j                                         }t          t          |d                     S )z
        Iteration over a L{Names} subclass results in all of the constants it
        contains.

        @return: an iterator the elements of which are the L{NamedConstant}
            instances defined in the body of this L{Names} subclass.
        c                     | j         S r   )r   )rG   s    r   <lambda>z3_ConstantsContainer.iterconstants.<locals>.<lambda>  s	    Z5F r   )key)rA   valuesiterr?   )rD   rF   s     r   iterconstantsz!_ConstantsContainer.iterconstants  s@     O**,,	9"F"FGGGI I 	Ir   )
r   r1   r2   r3   r8   r:   classmethodr@   rS   rZ   r4   r   r   rM   rM      s          MI I I   [   [$ I I [I I Ir   rM    c                       e Zd ZdZdS )NamedConstanta  
    L{NamedConstant} defines an attribute to be a named constant within a
    collection defined by a L{Names} subclass.

    L{NamedConstant} is only for use in the definition of L{Names}
    subclasses.  Do not instantiate L{NamedConstant} elsewhere and do not
    subclass it.
    N)r   r1   r2   r3   r4   r   r   r^   r^     s           r   r^   c                       e Zd ZdZeZdS )Namesze
    A L{Names} subclass contains constants which differ only in their names and
    identities.
    N)r   r1   r2   r3   r^   r8   r4   r   r   r`   r`     s          "MMMr   r`   c                       e Zd ZdZd ZdS )ValueConstanta  
    L{ValueConstant} defines an attribute to be a named constant within a
    collection defined by a L{Values} subclass.

    L{ValueConstant} is only for use in the definition of L{Values} subclasses.
    Do not instantiate L{ValueConstant} elsewhere and do not subclass it.
    c                 H    t                               |            || _        d S r   r   r   r/   r   r/   s     r   r   zValueConstant.__init__0  !    4   


r   N)r   r1   r2   r3   r   r4   r   r   rb   rb   (  s-             r   rb   c                   ,    e Zd ZdZeZed             ZdS )Valuesza
    A L{Values} subclass contains constants which are associated with arbitrary
    values.
    c                 l    |                                  D ]}|j        |k    r|c S t          |          )a  
        Retrieve a constant by its value or raise a C{ValueError} if there is
        no constant associated with that value.

        @param value: The value of one of the constants defined by C{cls}.

        @raise ValueError: If C{value} is not the value of one of the constants
            defined by C{cls}.

        @return: The L{ValueConstant} associated with C{value}.
        )rZ   r/   r=   )rD   r/   constants      r   lookupByValuezValues.lookupByValue=  sH     ))++ 	  	 H~&& 'r   N)r   r1   r2   r3   rb   r8   r[   rk   r4   r   r   rh   rh   6  s>          "M    [     r   rh   c                      | |j         |j                   } | |j        |j                  }t                      }|                    |j        ||           |S )a  
    Implement a binary operator for a L{FlagConstant} instance.

    @param op: A two-argument callable implementing the binary operation.  For
        example, C{operator.or_}.

    @param left: The left-hand L{FlagConstant} instance.
    @param right: The right-hand L{FlagConstant} instance.

    @return: A new L{FlagConstant} instance representing the result of the
        operation.
    )r/   namesFlagConstantr0   r   )opleftrightr/   rm   results         r   _flagOprs   Q  sT     Btz5;''EBtz5;''E^^F
OODOUE222Mr   c                   P    e Zd ZdZefdZd Zd Zd Zd Z	d Z
d Zd	 Zd
 ZeZdS )rn   a  
    L{FlagConstant} defines an attribute to be a flag constant within a
    collection defined by a L{Flags} subclass.

    L{FlagConstant} is only for use in the definition of L{Flags} subclasses.
    Do not instantiate L{FlagConstant} elsewhere and do not subclass it.
    c                 H    t                               |            || _        d S r   rd   re   s     r   r   zFlagConstant.__init__n  rf   r   c                 ,   t          |t                    r|}t          |g          }n@t          |          dk    r|\  }n(dd                    t          |                    z   dz   }t                              | |||           || _        || _	        dS )aR  
        Complete the initialization of this L{FlagConstant}.

        This implementation differs from other C{_realize} implementations in
        that a L{FlagConstant} may have several names which apply to it, due to
        flags being combined with various operators.

        @param container: The L{Flags} subclass this constant is part of.

        @param names: When a single-flag value is being initialized, a C{str}
            giving the name of that flag.  This is the case which happens when
            a L{Flags} subclass is being initialized and L{FlagConstant}
            instances from its body are being realized.  Otherwise, a C{set} of
            C{str} giving names of all the flags set on this L{FlagConstant}
            instance.  This is the case when two flags are combined using C{|},
            for example.
           {,}N)
r   strsetlenjoinr?   r   r0   r/   rm   )r   r.   rm   r/   r   s        r   r0   zFlagConstant._realizes  s    $ eS!! 	7DLLEEZZ1__GTT&--00036D4D%888



r   c                 .    t          t          | |          S )z
        Define C{|} on two L{FlagConstant} instances to create a new
        L{FlagConstant} instance with all flags set in either instance set.
        )rs   r   r"   s     r   __or__zFlagConstant.__or__  s    
 sD%(((r   c                 .    t          t          | |          S )z
        Define C{&} on two L{FlagConstant} instances to create a new
        L{FlagConstant} instance with only flags set in both instances set.
        )rs   r   r"   s     r   __and__zFlagConstant.__and__  s    
 tT5)))r   c                 .    t          t          | |          S )z
        Define C{^} on two L{FlagConstant} instances to create a new
        L{FlagConstant} instance with only flags set on exactly one instance
        set.
        )rs   r	   r"   s     r   __xor__zFlagConstant.__xor__  s     sD%(((r   c                     t                      }|                    | j        t                      d           | j                                        D ]}|j        | j        z  dk    r||z  }|S )z
        Define C{~} on a L{FlagConstant} instance to create a new
        L{FlagConstant} instance with all flags not set on this instance set.
        r   )rn   r0   r   r|   rZ   r/   )r   rr   flags      r   
__invert__zFlagConstant.__invert__  si    
 222O1133 	 	DzDJ&!++$r   c                 *      fd j         D             S )zI
        @return: An iterator of flags set on this instance set.
        c              3   L   K   | ]}j                             |          V  d S r   )r   rS   ).0r   r   s     r   	<genexpr>z(FlagConstant.__iter__.<locals>.<genexpr>  s3      JJt,,T22JJJJJJr   )rm   r   s   `r   __iter__zFlagConstant.__iter__  s"     KJJJtzJJJJr   c                 &    t          || z            S )z
        @param flag: The flag to test for membership in this instance
            set.

        @return: C{True} if C{flag} is in this instance set, else
            C{False}.
        )bool)r   r   s     r   __contains__zFlagConstant.__contains__  s     D4K   r   c                 *    t          | j                  S )zL
        @return: C{False} if this flag's value is 0, else C{True}.
        )r   r/   r   s    r   __nonzero__zFlagConstant.__nonzero__  s     DJr   N)r   r1   r2   r3   rQ   r   r0   r   r   r   r   r   r   r   __bool__r4   r   r   rn   rn   f  s          *    
  <) ) )* * *) ) )
 
 
K K K	! 	! 	!     
 HHHr   rn   c                   0    e Zd ZdZeZdZed             ZdS )Flagsz
    A L{Flags} subclass contains constants which can be combined using the
    common bitwise operators (C{|}, C{&}, etc) similar to a I{bitvector} from a
    language like C.
    rw   c                 t    |j         t          u r| j        }| xj        dz  c_        n|j         }|dz  | _        |S )a
  
        For L{FlagConstant} instances with no explicitly defined value, assign
        the next power of two as its value.

        @param name: The name of the constant to create.

        @param descriptor: An instance of a L{FlagConstant} which is assigned
            to C{name}.

        @return: Either the value passed to the C{descriptor} constructor, or
            the next power of 2 value which will be assigned to C{descriptor},
            relative to the value of the last defined L{FlagConstant}.
        rw   )r/   rQ   _value)rD   r   rG   r/   s       r   r@   zFlags._constantFactory  sC     |++JEJJ1JJJ$E!CJr   N)	r   r1   r2   r3   rn   r8   r   r[   r@   r4   r   r   r   r     sC         
 !MF  [  r   r   N)r3   
__future__r   r   __all__	functoolsr   	itertoolsr   operatorr   r   r	   objectrQ   nextr   r   typer6   rM   r^   r`   rb   rh   rs   rn   r   r4   r   r   <module>r      s]  
 
 1 0 0 0 0 0 0 0
             # # # # # # # # # #vxxuuww''m m m m m m m mb4 4 4 4 4d 4 4 4~II II II II II11"viDD II II IIZ    I   " " " " " " " "
 
 
 
 
I 
 
 
                6  *i i i i i9 i i iZ    F     r   