o Ƌ|c@sddlZddlmZmZgdZddZddZdd Zd d Zd d Z e Z GdddZ Gddde ZdZGdddeZGdddedZGdddeeZddZGdddeZGdddeeZdd Zd!d"Zd#d$ZdS)%N)MappingProxyTypeDynamicClassAttribute)EnumMetaEnumIntEnumFlagIntFlagautouniquecCst|dpt|dpt|dS)z? Returns True if obj is a descriptor, False otherwise. __get____set__ __delete__)hasattr)objr!/opt/conda/lib/python3.10/enum.py_is_descriptor s rcCsLt|dko%|dd|ddkodkno%|ddko%|ddkS)z= Returns True if a __dunder__ name, False otherwise. NZ___lennamerrr _is_dunders &  rcCsLt|dko%|d|dkodkno%|dddko%|dddkS)z; Returns True if a _sunder_ name, False otherwise. rrrrrrrrr _is_sunder!s rcCs^d|f}t|}t||kr-||r-|||ddgkr-|ddks+|ddkr-dSdS)Nz_%s__rrrrTF)r startswith)Zcls_namerpatternZpat_lenrrr _is_private,s  r"cCsdd}||_d|_dS)z, Make the given class un-picklable. cSs td|)Nz%r cannot be pickled) TypeErrorselfZprotorrr_break_on_call_reduce>s z6_make_class_unpicklable.._break_on_call_reducez N) __reduce_ex__ __module__)clsr&rrr_make_class_unpicklable:s r*c@seZdZdZeZdS)r zP Instances are replaced with an appropriate value in Enum class suites. N)__name__r( __qualname____doc__ _auto_nullvaluerrrrr Dsr cs,eZdZdZfddZfddZZS) _EnumDictz Track enum member order and ensure member names are not reused. EnumMeta will use the names found in self._member_names as the enumeration member names. cs&tg|_g|_g|_d|_dS)NF)super__init__ _member_names _last_values_ignore _auto_calledr% __class__rrr2Rs  z_EnumDict.__init__cst|j|rddl}|jd|ftddt|r_|dvr!td|dkr3|jr,td t |d |n|d kr^t |t rE| d d  }nt|}||_t|t|j@}|r^td|fn[t|rj|dkrid}nP||jvrutd|||jvr{n?t|s||vrtd|||ft |tr|jtkr||dt|j|jdd|_d|_|j}|j||j|t||dS)z Changes anything not dundered or not a descriptor. If an enum member name is used twice, an error is raised; duplicate values are not checked for. Single underscore (sunder) names are reserved. rNz@private variables, such as %r, will be normal attributes in 3.11r stacklevel)_order__create_pseudo_member__generate_next_value_ _missing__ignore_z(_names_ are reserved for future Enum user>z4_generate_next_value_ must be defined before members_generate_next_valuer@, z-_ignore_ cannot specify already set names: %rZ __order__r<zAttempted to reuse key: %rz%r already defined as: %rrT)r" _cls_namewarningswarnDeprecationWarningr ValueErrorr6r#setattr isinstancestrreplacesplitlistr5setr3rrr r/r.rArr4appendr1 __setitem__)r%keyr/rEZalreadyr8rrrQYsj          z_EnumDict.__setitem__)r+r(r,r-r2rQ __classcell__rrr8rr0Ks r0cseZdZdZeddZfddZddZd-dddd d d d Zd dZ fddZ ddZ ddZ ddZ ddZddZeddZddZdd Zfd!d"Zdddd d d#d$Zd-d%d&Zed'd(Zed)d*Zed+d,ZZS).rz Metaclass for Enum cKsD|||t}||_|||\}}|dur t|dd|d<|S)Nr>)_check_for_existing_membersr0rD _get_mixins_getattr)metaclsr)baseskwdsZ enum_dict member_type first_enumrrr __prepare__s zEnumMeta.__prepare__c sdgdd}|D]}|dq|||\}||\}} } fddjD} jD]} | =q7dd} t| ddh@}|rWtdd |d vr_d d <t j |||fi|}g|_ i|_ |_d d |D}i|_d vrՈturd}tfdd|Dsdvrt|n6d}|D]+}|jD]turqtfdd|Drd}n djvrd}nq|durnq|rt|jD]}| |}t|ts|f}n|}tur|f}| s||}t|ds||_n||g|R}t|dstur||_n||_|j}||_||_|j||j D]\} }|j|jkr=|}nq.|j |||vrPt|||||j |<z||j|<WqtyfYqwdD]+} | vrrqit || }t | d}t || d}|dur||urt|| |qit!dur| r||_"t!j |_ | durt| t#r| $dd%} | |j krtd|S)Nr@csi|]}||qSrr).0k) classdictrr sz$EnumMeta.__new__..r<mrozInvalid enum member name: {0}rBr-zAn enumeration.cSs.h|]}|jD] \}}t|tr |q qSr)__dict__itemsrJr)r]cr^vrrr sz#EnumMeta.__new__..r')Z__getnewargs_ex____getnewargs__r' __reduce__c3|]}|jvVqdSNrcr]m)rZrr z#EnumMeta.__new__..__new__c3rjrkrlrm)baserrrorpFT_value_)__repr____str__ __format__r'rCz#member order does not match _order_)& setdefaultrPpoprU _find_new_r3rOrHformatjoinr1rq_member_names_ _member_map_ _member_type_ra_value2member_map_objectanyr*__mro__rcrJtuplerrs_name_ __objclass__r2rdrIr#rVr__new_member__rKrLrM)rWr)rXr_rYignorerRr[rqsave_newuse_argsZ enum_membersrr<Z invalid_names enum_classZdynamic_attributesmethodsZsabotagechain member_namer/argsZ enum_memberZcanonical_memberZ class_methodZ obj_methodZ enum_methodr8)rrr_rZrrqs                           zEnumMeta.__new__cCsdS)z6 classes/types should always be True. Trr7rrr__bool__aszEnumMeta.__bool__NrmodulequalnametypestartcCs*|dur |||S|j||||||dS)a! Either returns an existing member, or creates a new enum class. This method is used both when an enum class is given a value to match to an enumeration member (i.e. Color(3)) and for the functional API (i.e. Color = Enum('Color', names='RED GREEN BLUE')). When used for the functional API: `value` will be the name of the new class. `names` should be either a string of white-space/comma delimited names (values will start at `start`), or an iterator/mapping of name, value pairs. `module` should be set to the module this class is being created in; if it is not set, an attempt to find that module will be made, but if it fails the class will not be picklable. `qualname` should be set to the actual location this class can be found at in its module; by default it is set to the global scope. If this is not correct, unpickling will fail in some circumstances. `type`, if set, will be mixed in as the first base class. Nr)rq_create_)r)r/namesrrrrrrr__call__gs zEnumMeta.__call__cCsRt|tsddl}|jdtddtdt|j|jjft||o(|j |j vS)Nrzpin 3.12 __contains__ will no longer raise TypeError, but will return True if obj is a member or a member's valuerr:3unsupported operand type(s) for 'in': '%s' and '%s') rJrrErFrGr#rr,r9rr})r)rrErrr __contains__s zEnumMeta.__contains__cs(||jvr td|jt|dS)Nz%s: cannot delete Enum member.)r}AttributeErrorr+r1 __delattr__)r)attrr8rrrs zEnumMeta.__delattr__cCsgd|jS)N)r9r- __members__r(r|r7rrr__dir__szEnumMeta.__dir__cCs6t|rt|z|j|WStyt|dw)a= Return the enum member matching `name` We use __getattr__ instead of descriptors or inserting into the enum class' __dict__ in order to support `name` and `value` being both properties for enum members (which live in the class' __dict__) and enum members themselves. N)rrr}KeyErrorr)rrrr __getattr__s    zEnumMeta.__getattr__cCs |j|Srkr}rrrr __getitem__ zEnumMeta.__getitem__csfddjDS)z6 Returns members in definition order. c3|]}j|VqdSrkrr]rr)rrrorpz$EnumMeta.__iter__..rrrrr__iter__szEnumMeta.__iter__cC t|jSrk)rr|rrrr__len__rzEnumMeta.__len__cCr)z Returns a mapping of member name->value. This mapping lists all enum members, including aliases. Note that this is a read-only view of the internal mapping. )rr}rrrrrs zEnumMeta.__members__cCs d|jS)Nz )r+rrrrrtrzEnumMeta.__repr__csfddtjDS)z> Returns members in reverse definition order. c3rrkrrrrrrorpz(EnumMeta.__reversed__..)reversedr|rrrr __reversed__szEnumMeta.__reversed__cs0|jdi}||vrtdt||dS)a Block attempts to reassign Enum members. A simple assignment to the class namespace only changes one of the several possible ways to get an Enum member from the Enum class, resulting in an inconsistent Enumeration. r}zCannot reassign members.N)rcgetrr1 __setattr__)r)rr/Z member_mapr8rrrszEnumMeta.__setattr__c Csf|j}|dur |fn||f}|||\} } |||} t|tr)|dd}t|ttfra|rat|dtra|g} }g} t | D]\}}| |||| dd}| || ||fqD|D]}t|trr|||}}n|\}}|| |<qc| |||| }|durz t djd}Wn tttfyYnw|durt|n||_|dur||_|S)a Convenience method to create a new Enum class. `names` can be: * A string containing member names, separated either with spaces or commas. Values are incremented by 1 from `start`. * An iterable of member names. Values are incremented by 1 from `start`. * An iterable of (member name, value) pairs. * A mapping of member name -> value pairs. NrBrCrrr+)r9rUr\rJrKrLrMrrN enumerater>rPrqsys _getframe f_globalsrrHrr*r(r,)r) class_namerrrrrrWrXrr[r_Zoriginal_names last_valuescountrr/itemr member_valuerrrrrs>         zEnumMeta._create_csttj|}|rt|}n|}fdd|D}z |jdddWnty6|jdddYnw||||d}t|_||j |||<|S)z[ Create a new Enum subclass that replaces a collection of global constants cs g|] \}}|r||fqSrr)r]rr/filterrr )s z&EnumMeta._convert_..cSs|d|dfS)Nrrrtrrr/sz$EnumMeta._convert_..)rRcSs|dSNrrrrrrr2s)r) varsrmodulesrdsortr#_reduce_ex_by_namer'updater)r)rrrsourceZmodule_globalsmembersrrr _convert_s"     zEnumMeta._convert_cCs<|D]}|jD]}t|tr|jrtd||jfqqdS)Nz %s: cannot extend enumeration %r)r issubclassrr|r#r+)rrXrrrrrrrT9s z$EnumMeta._check_for_existing_memberscsT|sttfSfdd}|d}t|tstd||pt}|jr&td||fS)z Returns the type for creating enum members, and the first inherited enum class. bases: the tuple of bases that was given to __new__ cst}|D]:}d}|jD]2}|turq t|tr&|jtur%||jnq d|jvr:t|tr1q ||p6|n|p=|}q qt|dkrNt d|f|rT| SdS)Nrqrz%r: too many data types: %r) rOrrrrr~addrcrr#rx)rXZ data_typesrZ candidaterrrrr_find_data_typeNs.        z.EnumMeta._get_mixins_.._find_data_typerzZnew enumerations should be created as `EnumName([mixin_type, ...] [data_type,] enum_type)`zCannot extend enumerations)rrrr#r|)rrXrr[rZrrrrUCs   zEnumMeta._get_mixins_c Cs|dd}|du}|dur8dD]$}||fD]}t||d}|ddjtjtjhvr-|}nq|dur4nqtj}|tjur@d}nd}|||fS)a Returns the __new__ to be used for creating the enum members. classdict: the class dictionary given to __new__ member_type: the data type whose __new__ will be used by default first_enum: enumeration to check for an overriding __new__ rqN)rrqFT)rrVrqrr) r_rZr[rqrmethodZpossibletargetrrrrryrs.     zEnumMeta._find_new_rk)r+r(r,r- classmethodr\rqrrrrrrrrrpropertyrrtrrrr staticmethodrTrUryrSrrr8rrs8  .%     5!  .rc@steZdZdZddZddZeddZdd Zd d Z d d Z ddZ ddZ ddZ eddZeddZdS)rzV Generic enumeration. Derive from this class to define new enumerations. c Cst||ur|Sz|j|WStyYnty2|jD] }|j|kr/|YSq"Ynwz d}||}WntyR}z |}d}WYd}~nd}~wwz6t ||r`|Wd}d}St d||j f}|durs|durs||durtd|j |f}t |t s||_ |d}d}w)N%r is not a valid %szDerror in %s._missing_: returned %r instead of None or a valid member)rrrr#r}valuesrsr? ExceptionrJrHr,r+ __context__)r)r/memberexcresulteZve_excrrrrqsP        z Enum.__new__c Cs2t|D]}z|dWStyYqw|S) Generate the next value when not given. name: the name of the member start: the initial start value or None count: the number of existing members last_value: the last value assigned or None r)rr#)rrrr last_valuerrrr>s  zEnum._generate_next_value_cCsdSrkr)r)r/rrrr?szEnum._missing_cCsd|jj|j|jfS)N <%s.%s: %r>)r9r+rrsr7rrrrtsz Enum.__repr__cCsd|jj|jfS)N%s.%s)r9r+rr7rrrrusz Enum.__str__cs4fddjDddjD}gd|S)z< Returns all members and all public methods cs2g|]}|jD]}|ddkr|jvr|qqSrr)rcr})r]r)rnr7rrrsz Enum.__dir__..cSsg|] }|ddkr|qSrrrmrrrr)r9r-r()r9rarc)r%Zadded_behaviorrr7rrs  z Enum.__dir__cCsJt|jtjtjfv}|jtus|rt}t|}n|j}|j}|||S)z\ Returns format using actual value type unless __str__ has been overridden. ) rrurrr~rrKrsrv)r% format_specZstr_overriddenr)valrrrrvs   zEnum.__format__cCrrk)hashrr7rrr__hash__rz Enum.__hash__cCs|j|jffSrkr9rsr$rrrr'szEnum.__reduce_ex__cC|jS)zThe name of the Enum member.)rr7rrrrz Enum.namecCr)zThe value of the Enum member.rsr7rrrr/!rz Enum.valueN)r+r(r,r-rqr>rr?rtrurrvrr'rrr/rrrrrs .   r) metaclassc@seZdZdZdS)rz.Enum where members are also (and must be) intsN)r+r(r,r-rrrrr'srcCrrkrr$rrrr+src@speZdZdZddZeddZeddZdd Zd d Z d d Z ddZ ddZ ddZ ddZddZdS)rz Support for flags c CsX|s |dur|SdSt|D]}zt|}Wnty%td|dwd|dS)rNrzInvalid Flag value: %rr)r _high_bitrr#)rrrrrZhigh_bitrrrr>3s    zFlag._generate_next_value_cCs.|}|dkr |}||}|dkr|}|S)V Returns member (possibly creating it) if one can be found for value. r)r=)r)r/Zoriginal_valueZpossible_memberrrrr?Fs zFlag._missing_cCsb|j|d}|dur/t||\}}|rtd||jft|}d|_||_|j ||}|S)L Create a composite member iff value contains only members. Nr) rr _decomposerHr,rrqrrsrw)r)r/ pseudo_memberr extra_flagsrrrr=Ss zFlag._create_pseudo_member_cCs8t||jstdt|j|jjf|j|j@|jkS)zP Returns True if self has at least the same flags set as other. r)rJr9r#rr,rsr%otherrrrrgs zFlag.__contains__cCsV|j}|jdurd|j|j|jfSt||j\}}d|jddd|D|jfS)Nr|cSg|] }t|jp |jqSrrKrrsrmrrrrxrz!Flag.__repr__..)r9rr+rsrr{r%r)r uncoveredrrrrtqs z Flag.__repr__cCs||j}|jdurd|j|jfSt||j\}}t|dkr/|djdur/d|j|djfSd|jddd|DfS)Nrrrz%s.%rrcSrrrrmrrrrrz Flag.__str__..)r9rr+rrsrr{rrrrru|s z Flag.__str__cCrrk)boolrsr7rrrrrz Flag.__bool__cCs"t||jstS||j|jBSrkrJr9NotImplementedrsrrrr__or__ z Flag.__or__cCs"t||jstS||j|j@Srkrrrrr__and__rz Flag.__and__cCs"t||jstS||j|jASrkrrrrr__xor__rz Flag.__xor__cCsNt|j|j\}}|d}|jD]}||vr!|j|j@s!||B}q||Sr)rr9rs)r%rrZinvertedrnrrr __invert__s   zFlag.__invert__N)r+r(r,r-r>rr?r=rrtrurrrrrrrrrr.s      rc@sTeZdZdZeddZeddZddZdd Zd d Z eZ eZ e Z d d Z dS)rz) Support for integer-based Flags cCs*t|tstd||jf||}|S)rr)rJintrHr,r=)r)r/Z new_memberrrrr?s  zIntFlag._missing_cCs|j|d}|durU|g}t||\}}|r;t|}d|}||jvr-||vr-|||| kr5d}n||N}|st|D]}t||}d|_||_ |j ||}q?|S)rNrr) rrrrrPrrrqrrsrw)r)r/rZneed_to_createrrZbit flag_valuerrrr=s(    zIntFlag._create_pseudo_member_cCs0t||jtfs tS||j||jB}|SrkrJr9rrrs)r%rrrrrrszIntFlag.__or__cCs,t||jtfs tS||j||j@SrkrrrrrrzIntFlag.__and__cCs,t||jtfs tS||j||jASrkrrrrrrrzIntFlag.__xor__cCs||j}|Srkr)r%rrrrrszIntFlag.__invert__N)r+r(r,r-rr?r=rrr__ror____rand____rxor__rrrrrrs    rcCs |dS)zJ returns index of highest bit, or -1 if value is zero or negative r) bit_length)r/rrrrs rcCs^g}|jD]\}}||jkr|||jfq|r-ddd|D}td||f|S)zI Class decorator for enumerations ensuring unique member values. z, cSsg|] \}}d||fqS)z%s -> %sr)r]aliasrrrrrrzunique..z duplicate values found in %r: %s)rrdrrPr{rH)Z enumerationZ duplicatesrrZ alias_detailsrrrr s  r c Cs|}|dk}g}|D]}|j}|r!||@|kr!||||M}q |sG|}|rGdt|}||jvr@||j|||M}||M}|s(|sV||jvrV||j||jddddt|dkrq|dj|krq|d||fS)z- Extract all members from the value. rrcSrrkr)rnrrrrsz_decompose..T)rRreverser)r/rPrrrrrx) Zflagr/Z not_coverednegativerrrZtmprrrrrs0       r)rtypesrr__all__rrrr"r*rr.r dictr0rrrrrrrrrr rrrrrs4    TvI