
    h>              	       P   S r SSKJrJr  / rSSKJr  SSKJr  SSK	J
r
JrJr  \" 5       r\" \\" 5       5      r " S S\5      r " S S	\5      r " S
 S\" S\40 5      5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rS r " S S\5      r " S S\5      rg)zi
Symbolic constant support, including collections and constants with text,
numeric, and bit flag values.
    )divisionabsolute_import)partial)count)and_or_xorc                   B    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
rg)	_Constant   a  
@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                 0    S U l         [        5       U l        g N)
_container_constantOrder_indexselfs    \/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/constantly/_constants.py__init___Constant.__init__!   s    $&    c                 T    SU R                   R                  < SU R                  < S3$ )zY
Return text identifying both which constant this is and which
collection it belongs to.
<=>)r   __name__namer   s    r   __repr___Constant.__repr__&   s    
 !OO44dii@@r   c                     [        XR                  5      (       a  U R                  UR                  :X  d  [        $ U R                  UR                  :  $ )a  
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___Constant.__lt__.   >     5..115#3#33!!{{U\\))r   c                     [        XR                  5      (       a  U R                  UR                  :X  d  [        $ XL =(       d    U R                  UR                  :  $ )a   
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___Constant.__le__@   E     5..115#3#33!!}:ell ::r   c                     [        XR                  5      (       a  U R                  UR                  :X  d  [        $ U R                  UR                  :  $ )a  
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___Constant.__gt__R   r)   r   c                     [        XR                  5      (       a  U R                  UR                  :X  d  [        $ XL =(       d    U R                  UR                  :  $ )a  
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___Constant.__ge__d   r-   r   c                     Xl         X l        g)a7  
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   _realize_Constant._realizev   s     $	r   )r   r   r   N)r   
__module____qualname____firstlineno____doc__r   r   r'   r+   r/   r2   r7   __static_attributes__ r   r   r   r      s+    	'
A*$;$*$;$r   r   c                   ,   ^  \ rS rSrSrU 4S jrSrU =r$ )_ConstantsContainerType   zU
L{_ConstantsContainerType} is a metaclass for creating constants container
classes.
c                   > [         [        U ]  XX#5      n[        USS5      nUc  U$ / nUR	                  5        Hh  u  p[        XtR                  5      (       d  M!  UR                  b  [        SU< SUR                  < 35      eUR                  UR                  X45        Mj     0 n[        U5       H-  u  pnUR                  X5      nUR                  XJU5        XxU
'   M/     Xl        U$ )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 )superr@   __new__getattritemsr"   rC   r   
ValueErrorr   appendr   sorted_constantFactoryr7   _enumerants)r   r   bases
attributesclsconstantType	constants
descriptor
enumerantsindex	enumerantr6   r#   s               r   rE   _ConstantsContainerType.__new__   s    $ +T:+
 sOT:J	","2"2"4T*&7&788((4$&67 7   *"3"3T!FG #5 
.4Y.?*Uz((?E6$.y! /@ %
r   r>   )r   r9   r:   r;   r<   rE   r=   __classcell__)r#   s   @r   r@   r@      s    / /r   r@   c                   R    \ rS rSrSrSrS r\S 5       r\S 5       r	\S 5       r
Srg)	_ConstantsContainer   a  
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                 4    [        U R                  < S35      e)z{
Classes representing constants containers are not intended to be
instantiated.

The class object itself is used directly.
z may not be instantiated.)	TypeErrorr   )rO   s    r   rE   _ConstantsContainer.__new__   s     GHHr   c                     [         $ )aX  
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)rO   r   rR   s      r   rK   $_ConstantsContainer._constantFactory   s
     r   c                 L    XR                   ;   a  [        X5      $ [        U5      e)aY  
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}.
)rL   rF   rH   )rO   r   s     r   lookupByName _ConstantsContainer.lookupByName   s$     ??"3%%r   c                 ^    U R                   R                  5       n[        [        US S95      $ )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                     U R                   $ r   )r   )rR   s    r   <lambda>3_ConstantsContainer.iterconstants.<locals>.<lambda>  s
    Z5F5Fr   )key)rL   valuesiterrJ   )rO   rQ   s     r   iterconstants!_ConstantsContainer.iterconstants  s0     OO**,	9"FGI 	Ir   r>   )r   r9   r:   r;   r<   rC   rE   classmethodrK   rb   rk   r=   r>   r   r   rY   rY      sR     MI    $ I Ir   rY    c                       \ rS rSrSrSrg)NamedConstanti  a  
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.
r>   N)r   r9   r:   r;   r<   r=   r>   r   r   rp   rp     s    r   rp   c                       \ rS rSrSr\rSrg)Namesi  zY
A L{Names} subclass contains constants which differ only in their names and
identities.
r>   N)r   r9   r:   r;   r<   rp   rC   r=   r>   r   r   rr   rr     s     "Mr   rr   c                       \ rS rSrSrS rSrg)ValueConstanti(  a  
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                 :    [         R                  U 5        Xl        g r   r   r   r6   r   r6   s     r   r   ValueConstant.__init__0      4 
r   )r6   N)r   r9   r:   r;   r<   r   r=   r>   r   r   rt   rt   (  s    r   rt   c                   ,    \ rS rSrSr\r\S 5       rSr	g)Valuesi6  zU
A L{Values} subclass contains constants which are associated with arbitrary
values.
c                 n    U R                  5        H  nUR                  U:X  d  M  Us  $    [        U5      e)aL  
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}.
)rk   r6   rH   )rO   r6   constants      r   lookupByValueValues.lookupByValue=  s5     ))+H~~& , r   r>   N)
r   r9   r:   r;   r<   rt   rC   rm   r~   r=   r>   r   r   r{   r{   6  s      "M   r   r{   c                     U " UR                   UR                   5      nU " UR                  UR                  5      n[        5       nUR                  UR                  XC5        U$ )ak  
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.
)r6   namesFlagConstantr7   r   )opleftrightr6   r   results         r   _flagOpr   Q  sJ     tzz5;;'Etzz5;;'E^F
OODOOU2Mr   c                   X    \ rS rSrSr\4S jrS rS rS r	S r
S rS	 rS
 rS r\rSrg)r   if  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                 :    [         R                  U 5        Xl        g r   rv   rw   s     r   r   FlagConstant.__init__n  ry   r   c                     [        U[        5      (       a  Un[        U/5      nO4[        U5      S:X  a  Uu  nO SSR	                  [        U5      5      -   S-   n[        R                  XXC5        X0l        X l	        g)a  
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joinrJ   r   r7   r6   r   )r   r5   r   r6   r   s        r   r7   FlagConstant._realizes  si    $ eS!!DLEZ1_GT&-0036D4D8

r   c                 "    [        [        X5      $ )z
Define C{|} on two L{FlagConstant} instances to create a new
L{FlagConstant} instance with all flags set in either instance set.
)r   r   r%   s     r   __or__FlagConstant.__or__  s    
 sD((r   c                 "    [        [        X5      $ )z
Define C{&} on two L{FlagConstant} instances to create a new
L{FlagConstant} instance with only flags set in both instances set.
)r   r   r%   s     r   __and__FlagConstant.__and__  s    
 tT))r   c                 "    [        [        X5      $ )z
Define C{^} on two L{FlagConstant} instances to create a new
L{FlagConstant} instance with only flags set on exactly one instance
set.
)r   r	   r%   s     r   __xor__FlagConstant.__xor__  s     sD((r   c                     [        5       nUR                  U R                  [        5       S5        U R                  R	                  5        H&  nUR
                  U R
                  -  S:X  d  M"  X-  nM(     U$ )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   )r   r7   r   r   rk   r6   )r   r   flags      r   
__invert__FlagConstant.__invert__  s[    
 2OO113DzzDJJ&!+ 4 r   c                 0   ^  U 4S jT R                    5       $ )z9
@return: An iterator of flags set on this instance set.
c              3   Z   >#    U  H   nTR                   R                  U5      v   M"     g 7fr   )r   rb   ).0r   r   s     r   	<genexpr>(FlagConstant.__iter__.<locals>.<genexpr>  s#     Jzt,,T22zs   (+)r   r   s   `r   __iter__FlagConstant.__iter__  s     KtzzJJr   c                     [        X-  5      $ )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__FlagConstant.__contains__  s     DK  r   c                 ,    [        U R                  5      $ )z<
@return: C{False} if this flag's value is 0, else C{True}.
)r   r6   r   s    r   __nonzero__FlagConstant.__nonzero__  s     DJJr   )r   r6   N)r   r9   r:   r;   r<   r_   r   r7   r   r   r   r   r   r   r   __bool__r=   r>   r   r   r   r   f  sA     * 
<)*)
K	! 
 Hr   r   c                   0    \ rS rSrSr\rSr\S 5       r	Sr
g)Flagsi  z
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.
r   c                     UR                   [        L a#  U R                  nU =R                  S-  sl        U$ UR                   nUS-  U l        U$ )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}.
r   )r6   r_   _value)rO   r   rR   r6   s       r   rK   Flags._constantFactory  sM     |+JJEJJ1J  $$E!CJr   r>   N)r   r9   r:   r;   r<   r   rC   r   rm   rK   r=   r>   r   r   r   r     s%    
 !MF r   r   N)r<   
__future__r   r   __all__	functoolsr   	itertoolsr   operatorr   r   r	   objectr_   nextr   r   typer@   rY   rp   rr   rt   r{   r   r   r   r>   r   r   <module>r      s   

 1
   # #xuw'm mb4d 4~II1"viD IIZI " "
I 
    6*i9 iZF r   