ó
    Í›‘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    ÚYC:\Users\psant\Downloads\Noiseback\school\venv\Lib\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   � ð
 !ŸO™O×4Ô4°d·i´iÐ@Ð@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ä!Ð!Øˆ}×: §¡¨e¯l©lÑ :Ð: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  pšnUR                  X§5      nUR                  XJU5        XxU
'   M/     X„l        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Ñ:Ø˜ó+ˆô
 ˜s O°TÓ:ˆØÑØˆJàˆ	Ø",×"2Ñ"2Ö"4ÑˆTÜ˜*×&7Ñ&7×8Ó8Ø×(Ñ(Ñ4Ý$ã&¨¯«ð6ó7ð 7ð × Ñ  *×"3Ñ"3°TÐ!FÖGñ #5ð ˆ
Ü.4°YÖ.?Ñ*ˆU˜zØ×(Ñ(¨Ó?ˆ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
   € °Z×5FÒ5Fr   )Úkey)rL   ÚvaluesÚiterrJ   )rO   rQ   s     r   ÚiterconstantsÚ!_ConstantsContainer.iterconstants  s0   € ð —O‘O×*Ñ*Ó,ˆ	äÜ�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   € ñ ˆt�z‰z˜5Ÿ;™;Ó'€EÙˆt�z‰z˜5Ÿ;™;Ó'€EÜ‹^€FØ
‡O�O�D—O‘O UÔ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   € ô$ �eœS×!Ñ!ØˆDÜ˜˜“L‰EÜ�‹Z˜1‹_Ø‰G‰Tà˜Ÿ™¤&¨£-Ó0Ñ0°3Ñ6ˆDÜ×Ñ˜4¨DÔ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   € ô
 ”s˜DÓ(Ð(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   € ô
 ”t˜TÓ)Ð)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   € ô ”s˜DÓ(Ð(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Ø—O‘O×1Ñ1Ö3ˆDØ�z‰z˜DŸJ™JÑ&¨!Õ+Ø‘’ñ 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#   øé € ÐJºz°t�—‘×,Ñ,¨T×2Ð2ºzùs   ƒ(+)r�   r   s   `r   Ú__iter__ÚFlagConstant.__iter__·  s   ø€ ô K¸t¿zºzÓ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   € ô �D‘KÓ Ð 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   € ô �D—J‘JÓÐ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   € ð ×Ñœ|Ò+Ø—J‘JˆEØ�JŠJ˜1Ñ�Jð ˆð ×$Ñ$ˆEØ !™ˆCŒJØˆ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€Ù˜™u›wÓ'€ôm�ô môb4˜dô 4ô~IIÑ1°"°v°iÀÓDô IIôZ�Iô ô"Ðô "ô
�Iô 
ô Ð ô  ò6ô*i�9ô iôZˆFõ r   