a :i@sBdZddlmZddlZddlZedZGdddZdgZdS)zNA Python specification is an abstract requirement definition of an interpreter) annotationsNz@^(?P[a-zA-Z]+)?(?P[0-9.]+)?(?:-(?P32|64))?$c@sNeZdZdZddddZeddZdd Zed d Z d d Z ddZ dS) PythonSpecz1Contains specification about a Python InterpreterNone)returncCs.||_||_||_||_||_||_||_dSN)str_specimplementationmajorminormicro architecturepath)selfrrr r r r r r@/usr/lib/python3.9/site-packages/virtualenv/discovery/py_spec.py__init__szPythonSpec.__init__cCsXd\}}}}}}tj|r$|}n d}tt|} | r:dd} z| } | d} | durtdd| dD} t | d krt t | d kr| \}}}nVt | d kr| \}}n@t | d kr| d }t t |d }|d krt t |d d}d}Wnt y Yn.0| d}|dks*|dkr.d}| | d}|sD|}||||||||S)N)NNNNNNFcSs|dur dSt|Srint)valrrr _int_or_none!sz1PythonSpec.from_string_spec.._int_or_noneversioncss|]}|rt|VqdSrr).0irrr (z.PythonSpec.from_string_spec...r Timplpypythonarch) osr isabsrematchPATTERN groupdicttuplesplitlen ValueErrorrstr)clsZ string_specr r r r r#r okr'rgroupsrZversionsZ version_datarrrfrom_string_specsB         zPythonSpec.from_string_specc Csdjdd|j|j|jfD}|jdur.dndt|j}|rHdnd}|sZ|jdur^d nd}tjd |d |d ||d tjdS)z>Generate a regular expression for matching against a filename.z{}(\.{}(\.{})?)?css|]}|durdn|VqdS)Nz\d+r)rvrrrrErz)PythonSpec.generate_re..Nr"zpython|z\.exe?z (?Pz)(?P)$)flags) formatr r r rr&escapecompile IGNORECASE)rZwindowsrr suffixZversion_conditionalrrr generate_reBs   zPythonSpec.generate_recCs|jduotj|jSr)r r$r%rrrris_absWszPythonSpec.is_abscCs|jr|jr|j|jkrdS|jdur>|j|jkr>dS|jdurX|j|jkrXdSt|j|j|jf|j|j|jfD]&\}}|durz|durz||krzdSqzdS)z\called when there's a candidate metadata spec to see if compatible - e.g. PEP-514 on WindowsFNT) r@r rlowerr zipr r r )rspecZourZreqrrr satisfies[s*zPythonSpec.satisfiescs2tj}d}|ddfdd|DdS)N)rr r r r r (z, c3s0|](}t|dur|dt|VqdS)N=)getattr)rkr?rrrlrz&PythonSpec.__repr__..r6)type__name__join)rnameparamsrr?r__repr__is zPythonSpec.__repr__N) rJ __module__ __qualname____doc__r classmethodr2r>propertyr@rDrNrrrrr s  * r) rQZ __future__rr$r&r;r(r__all__rrrrs  e