a ?&Nb!@sddlmZmZmZddlZddlmZmZddlm Z m Z ddl m Z m Z erddlmZmZmZmZeedeeeffZed eZneZeZGd d d eZGd d d eZedZedZddZddZddZ ddZ!dS))absolute_importdivisionprint_functionN) TYPE_CHECKINGcast)Tag parse_tag)InvalidVersionVersion) FrozenSetNewTypeTupleUnionNormalizedNamec@seZdZdZdS)InvalidWheelFilenamezM An invalid wheel filename was found, users should refer to PEP 427. N__name__ __module__ __qualname____doc__rrr3/usr/lib/python3.9/site-packages/packaging/utils.pyrsrc@seZdZdZdS)InvalidSdistFilenamez^ An invalid sdist filename was found, users should refer to the packaging user guide. Nrrrrrrsrz[-_.]+z (\d+)(.*)cCstd|}tt|S)N-)_canonicalize_regexsublowerrr)namevaluerrrcanonicalize_name'sr c Cst|ts.z t|}Wnty,|YS0g}|jdkrN|d|j|tddddd|j D|j dur|dd d|j D|j dur|d |j |j dur|d |j |j dur|d |j d|S) z This is very similar to Version.__str__, but has one subtle difference with the way it handles the release segment. rz{0}!z(\.0)+$.css|]}t|VqdSNstr.0xrrr Cz'canonicalize_version..Ncss|]}t|VqdSr#r$r&rrrr)Gr*z.post{0}z.dev{0}z+{0}) isinstancer r ZepochappendformatrerjoinreleaseZpreZpostdevlocal)versionpartsrrrcanonicalize_version.s$     &    r5c Cs|dstd||dd}|d}|dvrDtd||d|d}|d}d |vsxtd |tjdurtd |t|}t |d }|d kr|d}t |}|durtd||t t t |d |df}nd}t|d} |||| fS)Nz.whlz6Invalid wheel filename (extension must be '.whl'): {0}r)z3Invalid wheel filename (wrong number of parts): {0}r__z ^[\w\d._]*$zInvalid project name: {0}rr8z"Invalid build number: {0} in '{1}'r)endswithrr-countsplitr.matchUNICODEr r _build_tag_regexrBuildTagintgroupr ) filenameZdashesr4 name_partrr3Z build_partZ build_matchZbuildtagsrrrparse_wheel_filenameXs6        rHcCsZ|dstd||ddd\}}}|sBtd|t|}t|}||fS)Nz.tar.gzz9Invalid sdist filename (extension must be '.tar.gz'): {0}irzInvalid sdist filename: {0})r<rr- rpartitionr r )rErFsepZ version_partrr3rrrparse_sdist_filename{s rK)"Z __future__rrrr.Z_typingrrrGrr r3r r typingr r rrrCr%rBrtuple ValueErrorrrcompilerrAr r5rHrKrrrrs$   *#