o knh/ @sUddlmZddlZddlZddlZddlZddlmZmZm Z m Z m Z m Z m Z ddlmZmZmZmZmZddlmZddlmZddlmZmZdd lmZgd Ze ee eeefgefZ e d Z!d d hZ"Gddde#Z$Gddde#Z%Gddde#Z&Gddde Z'dFddZ( dGdHd!d"Z)d#d$d%d$ej*ej+ej,ej-ej.ej/d&Z0d'e1d(<dId/d0Z2dJd3d4Z3dKd9d:Z4dLd=d>Z5dMd?d@Z6GdAdBdBZ7dNdDdEZ8dS)O) annotationsN) AbstractSetAnyCallableLiteral TypedDictUnioncast) MarkerAtom MarkerListOpValueVariable) parse_marker)ParserSyntaxError)InvalidSpecifier Specifiercanonicalize_name)EvaluateContext InvalidMarkerMarkerUndefinedComparisonUndefinedEnvironmentNamedefault_environment)metadata lock_file requirementextrasdependency_groupsc@eZdZdZdS)rzE An invalid marker was found, users should refer to PEP 508. N__name__ __module__ __qualname____doc__r'r'sz!_format_marker.. ()cSsg|]}|qSr') serializerHr'r'r( z"_format_marker..)r;listr<r+lenrGjoin)rCrEinnerr'r'r(rGs     rGcCs||vSNr'r>r@r'r'r(rXcCs||vSrVr'rWr'r'r(rXrY)inznot in=>zdict[str, Operator] _operatorsr>r?r r@str | AbstractSet[str]boolcCst|tr#z td||g}Wn tyYnw|j|ddSt|}|durr?r@specoperr'r'r(_eval_ops   rgkey"tuple[str, str | AbstractSet[str]]cCsj|dkrt|ts Jdt|t|fS|tvr1t|tr&t|t|fSt|dd|DfS||fS)Nr:zextra value must be a stringcSsh|]}t|qSr'r)rIvr'r'r( rQz_normalize..)r;r+rMARKERS_ALLOWING_SET)r>r@rhr'r'r( _normalizes rmmarkersr environment!dict[str, str | AbstractSet[str]]c Csgg}|D]m}t|tttfsJt|tr!|dt||qt|trc|\}}}t|tr;|j}||}|j} n |j}|j}||} t|tsNJdt|| |d\}} |dt ||| q|dvsiJ|dkrr|gqt dd|DS)Nzlhs must be a string)rh)andorrscss|]}t|VqdSrV)all)rIitemr'r'r(rKsz$_evaluate_markers..) r;rRr<r+append_evaluate_markersrr=rmrgany) rnrogroupsrCr>r?r@environment_key lhs_value rhs_valuer'r'r(rws,      rwinfosys._version_infocCsB|jd|jd|j}|j}|dkr||dt|j7}|S)Nrbfinalr)majorminormicro releaselevelr+serial)r}versionkindr'r'r(format_full_versions rcCs^ttjj}tjj}||tjttt tt t d t ddtjd S)Nrb) r,r-r.r/r0r1r2r3r4r5r6)rsysimplementationrnameosplatformmachinereleasesystemr5python_implementationrTpython_version_tuple)iverr,r'r'r(rs rc@sNeZdZdddZdddZdd d Zdd d ZdddZ  dd ddZdS)!rrCr+r9Nonec Cs<z tt||_WdSty}ztt||d}~wwrV)rB _parse_marker_markersrrr+)selfrCer'r'r(__init__s zMarker.__init__cCs t|jSrV)rGrrr'r'r(__str__,s zMarker.__str__cCs d|dS)Nz r'rr'r'r(__repr__/s zMarker.__repr__intcCst|jjt|fSrV)hash __class__r#r+rr'r'r(__hash__2szMarker.__hash__otherrr_cCst|tstSt|t|kSrV)r;rNotImplementedr+)rrr'r'r(__eq__5s z Marker.__eq__Nrrodict[str, str] | NonecontextrcCsvtdt}|dkr|jttdn|dkrd|d<|dur3||d|vr3|ddur3d|d<t|jt|S)a?Evaluate a marker. Return the boolean from evaluating the given marker against the environment. environment is an optional argument to override all or part of the determined environment. The *context* parameter specifies what context the markers are being evaluated for, which influences what markers are considered valid. Acceptable values are "metadata" (for core metadata; default), "lock_file", and "requirement" (i.e. all other situations). The environment is determined from the current Python process. rpr)rr rr`r:N)r rupdate frozensetrwr_repair_python_full_version)rrorcurrent_environmentr'r'r(evaluate;s   zMarker.evaluate)rCr+r9r)r9r+)r9r)rrr9r_)Nr)rorrrr9r_) r#r$r%rrrrrrr'r'r'r(rs     renvcCs*tt|d}|dr|d|d<|S)z Work around platform.python_version() returning something that is not PEP 440 compliant for non-tagged Python builds. r3+local)r r+endswith)rr3r'r'r(r`s r)r8rr9r)T)rCrDrErFr9r+)r>r+r?r r@r^r9r_)r>r+r@r^rhr+r9ri)rnr rorpr9r_)r}r~r9r+)r9r*)rrpr9rp)9 __future__roperatorrrrtypingrrrrrrr _parserr r r rrrr _tokenizerr specifiersrrutilsr__all__r+r_Operatorrrl ValueErrorrrrr*rBrGltleeqnegegtr]r7rgrmrwrrrrr'r'r'r(sL$     H    N