
    ցj/                    @   S SK Jr  S SKrS SKJrJrJr  SSKJrJ	r	J
r
Jr  SSKJrJrJr  / SQrSS jr\\S	   \\\4   4   r \" S
\5      r  " S S\5      r " S S\5      r " S S\5      r\R6                  " S\R8                  \R:                  -  5      r\R6                  " S\R:                  5      r\R6                  " S\R:                  5      r \R6                  " S\RB                  5      r"SS.S S jjr#S!S jr$SS.     S"S jjr%SS.     S#S jjr&S$S jr'g)%    )annotationsN)NewTypeUnioncast   )
InvalidTagTagUnsortedTagsError	parse_tag)InvalidVersionVersion_TrimmedRelease)
BuildTagInvalidNameInvalidSdistFilenameInvalidWheelFilenameNormalizedNamecanonicalize_namecanonicalize_versionis_normalized_nameparse_sdist_filenameparse_wheel_filenamec                     [         $ )N)__all__     I/mnt/workspace/venv-train/lib/python3.13/site-packages/packaging/utils.py__dir__r      s    Nr   r   r   c                      \ rS rSrSrSrg)r   .   zg
An invalid distribution name; users should refer to the packaging user guide.

.. versionadded:: 23.2
r   N__name__
__module____qualname____firstlineno____doc____static_attributes__r   r   r   r   r   .       r   r   c                      \ rS rSrSrSrg)r   6   z]
An invalid wheel filename was found, users should refer to PEP 427.

.. versionadded:: 20.9
r   Nr!   r   r   r   r   r   6   r(   r   r   c                      \ rS rSrSrSrg)r   >   zn
An invalid sdist filename was found, users should refer to the packaging user guide.

.. versionadded:: 20.9
r   Nr!   r   r   r   r   r   >   r(   r   r   z%[a-z0-9]|[a-z0-9][a-z0-9._-]*[a-z0-9]z[a-z0-9]+(?:-[a-z0-9]+)*z	(\d+)(.*)z
^[\w._]+\ZF)validatec                  U(       a)  [         R                  U 5      (       d  [        SU < 35      eU R                  5       R	                  SS5      R	                  SS5      nSU;   a  UR	                  SS5      nSU;   a  M  [        SU5      $ )a  
This function takes a valid Python package or extra name, and returns the
normalized form of it.

The return type is typed as :class:`NormalizedName`. This allows type
checkers to help require that a string has passed through this function
before use.

If **validate** is true, then the function will check if **name** is a valid
distribution name before normalizing.

:param str name: The name to normalize.
:param bool validate: Check whether the name is a valid distribution name.
:raises InvalidName: If **validate** is true and the name is not an
    acceptable distribution name.

>>> from packaging.utils import canonicalize_name
>>> canonicalize_name("Django")
'django'
>>> canonicalize_name("oslo.concurrency")
'oslo-concurrency'
>>> canonicalize_name("requests")
'requests'

.. versionadded:: 16.2

.. versionchanged:: 20.4
   The return type was changed to :class:`NormalizedName`.

.. versionchanged:: 23.2
   Added the *validate* keyword parameter.
zname is invalid: _-.z--r   )_validate_regex	fullmatchr   lowerreplacer   )namer-   values      r   r   r   R   s    B 11$77-dX677 JJL  c*223<E
%-dC( %- %((r   c                0    [         R                  U 5      SL$ )a  
Check if a name is a normalized project name (i.e. a valid name that
:func:`canonicalize_name` would roundtrip to the same value).

The roundtrip only characterizes normalized names for *valid* names. A name
must start and end with an ASCII letter or digit, which
:func:`canonicalize_name` does not enforce: it leaves a leading or trailing
hyphen in place, so such a name roundtrips without being normalized.

:param str name: The name to check.

>>> from packaging.utils import canonicalize_name, is_normalized_name
>>> is_normalized_name("requests")
True
>>> is_normalized_name("Django")
False
>>> canonicalize_name("_not_legal")
'-not-legal'
>>> is_normalized_name("-not-legal")  # roundtrips, but not a valid name
False

.. versionadded:: 23.2
N)_normalized_regexr3   )r6   s    r   r   r      s    0 &&t,D88r   T)strip_trailing_zeroc                   [        U [        5      (       a   [        U 5      n [        U(       a  [	        U 5      5      $ U 5      $ ! [         a    [        U 5      s $ f = f)as  Return a canonical form of a version as a string.

This function takes a string representing a package version (or a
:class:`~packaging.version.Version` instance), and returns the
normalized form of it. By default, it strips trailing zeros from
the release segment.

>>> from packaging.utils import canonicalize_version
>>> canonicalize_version('1.0.1')
'1.0.1'

Per PEP 625, versions may have multiple canonical forms, differing
only by trailing zeros.

>>> canonicalize_version('1.0.0')
'1'
>>> canonicalize_version('1.0.0', strip_trailing_zero=False)
'1.0.0'

Invalid versions are returned unaltered.

>>> canonicalize_version('foo bar baz')
'foo bar baz'

>>> canonicalize_version('1.4.0.0.0')
'1.4'

.. versionadded:: 17.1

.. versionchanged:: 21.0
   The return type was narrowed to :class:`str`.

.. versionchanged:: 22.0
   Added the *strip_trailing_zero* keyword parameter.
)
isinstancestrr   r   r   )versionr:   s     r   r   r      sY    L '3	 g&G +>w'LLGLL  	 w<	 s   A AAvalidate_orderc                  U R                  S5      (       d  [        SU < 35      eU SS n U R                  S5      nUS;  a  [        SU < 35      eU R                  SUS-
  5      nUS	   nS
U;   d  [        R                  U5      c  [        SU < 35      e[        U5      n [        US   5      nUS:X  ae  US   n[        R                  U5      n	U	c  [        SU SU < 35      e[        S[        U	R                  S5      5      U	R                  S5      45      n
OSn
US   n [        XS9nXVX4$ ! [         a  n[        SU < 35      UeSnAff = f! [         a    [        SU < 35      Se[         a    [        SU < 35      Sef = f)a  
This function takes the filename of a wheel file, and parses it,
returning a tuple of name, version, build number, and tags.

The name part of the tuple is normalized and typed as
:class:`NormalizedName`. The version portion is an instance of
:class:`~packaging.version.Version`. The build number is ``()`` if
there is no build number in the wheel filename, otherwise a
two-item tuple of an integer for the leading digits and
a string for the rest of the build number. The tags portion is a
frozen set of :class:`~packaging.tags.Tag` instances (as the tag
string format allows multiple tags to be combined into a single
string).

If **validate_order** is true, compressed tag set components are
checked to be in sorted order as required by PEP 425.

:param str filename: The name of the wheel file.
:param bool validate_order: Check whether compressed tag set components
    are in sorted order.
:raises InvalidWheelFilename: If the filename in question
    does not follow the :ref:`wheel specification
    <pypug:binary-distribution-format>`.

>>> from packaging.utils import parse_wheel_filename
>>> from packaging.tags import Tag
>>> from packaging.version import Version
>>> name, ver, build, tags = parse_wheel_filename("foo-1.0-py3-none-any.whl")
>>> name
'foo'
>>> ver == Version('1.0')
True
>>> tags == {Tag("py3", "none", "any")}
True
>>> not build
True

.. versionadded:: 20.9

.. versionchanged:: 23.2
   Raises :class:`InvalidWheelFilename` when the version component is invalid.

.. versionadded:: 26.1
   The *validate_order* parameter.

.. versionchanged:: 26.3
   Raises :class:`InvalidWheelFilename` when an interpreter component is
   not an identifier, a tag set component is empty, or the project name is
   empty.
z.whlz3Invalid wheel filename (extension must be '.whl'): Nr0   )      z0Invalid wheel filename (wrong number of parts):    r   __zInvalid project name: r   z*Invalid wheel filename (invalid version): rD   zInvalid build number: z in r   r   r?   z\Invalid wheel filename (compressed tag set components must be in sorted order per PEP 425): z0Invalid wheel filename (invalid tag component): )endswithr   countsplit_wheel_name_regexmatchr   r   r   _build_tag_regexr   intgroupr   r
   r   )filenamer@   dashesparts	name_partr6   r>   e
build_partbuild_matchbuildtag_strtagss                r   r   r      s   n V$$"A(N
 	
 }H^^C FV">xlK
 	
 NN3
+EaIy-33I>F"%;H<#HIIY'D%(# {1X
&,,Z8&(DE  Z#k&7&7&:";[=N=Nq=Q!RSBiG
@ 5''7  "8E
	$  "**27
 	  ">xlK
	s$   "D0 #	E 0
E:E

E4Fc                   U R                  S5      (       a  U S[        S5      *  nO5U R                  S5      (       a  U S[        S5      *  nO[        SU < 35      eUR                  S5      u  p#nU(       d  [        SU < 35      eU(       d  [        SU < 35      e[	        U5      n [        U5      nXV4$ ! [         a  n[        SU < 35      UeSnAff = f)	a  
This function takes the filename of a sdist file (as specified
in the `Source distribution format`_ documentation), and parses
it, returning a tuple of the normalized name and version as
represented by an instance of :class:`~packaging.version.Version`.

:param str filename: The name of the sdist file.
:raises InvalidSdistFilename: If the filename does not end
    with an sdist extension (``.zip`` or ``.tar.gz``), if it does not
    contain a dash separating the name and the version of the distribution,
    if the project name is empty, or if the version portion is not a valid
    version.

>>> from packaging.utils import parse_sdist_filename
>>> from packaging.version import Version
>>> name, ver = parse_sdist_filename("foo-1.0.tar.gz")
>>> name
'foo'
>>> ver == Version('1.0')
True

.. versionadded:: 20.9

.. versionchanged:: 21.0
   Added support for ``.zip`` source distributions.

.. versionchanged:: 23.2
   Raises :class:`InvalidSdistFilename` when the version component is invalid.

.. versionchanged:: 26.3
   Raises :class:`InvalidSdistFilename` on an empty project name.

.. _Source distribution format: https://packaging.python.org/specifications/source-distribution-format/#source-distribution-file-name
z.tar.gzNz.zipz@Invalid sdist filename (extension must be '.tar.gz' or '.zip'): r0   zInvalid sdist filename: z-Invalid sdist filename (empty project name): z*Invalid sdist filename (invalid version): )rH   lenr   
rpartitionr   r   r   )rP   	file_stemrS   sepversion_partr6   r>   rT   s           r   r   r   2  s    F ##.I/				6	"	"^F|,	"|
 	
 $-#7#7#< IL"%=h\#JKK";H<H
 	
 Y'D,' ?  "8E
	s   (B6 6
C CC)returnz	list[str])r6   r=   r-   boolr`   r   )r6   r=   r`   ra   )r>   zVersion | strr:   ra   r`   r=   )rP   r=   r@   ra   r`   z8tuple[NormalizedName, Version, BuildTag, frozenset[Tag]])rP   r=   r`   ztuple[NormalizedName, Version])(
__future__r   retypingr   r   r   rY   r   r	   r
   r   r>   r   r   r   r   r   tuplerN   r=   r   r   
ValueErrorr   r   r   compile
IGNORECASEASCIIr2   r9   rM   UNICODErK   r   r   r   r   r   r   r   r   <module>rk      sT  
 # 	 ' ' ? ? = = rE#s(O+, )3/* : :  **,bmmbhh.F JJ:BHHE ::lBHH5  JJ}bjj9  6; *)Z98 <@+M+M48+M+Mb !g(g( g( >	g(T@r   