U ��.e*��@sdZddlmZddlZddlmZddlZddlZddlZddl m Z m Z ddl m Z mZmZddlmZdd lmZmZdd lmZmZe�e�ZGd d �d e �ZGd d�de �ZGdd�de �ZGdd�de �ZdddgZdZ dZ!e�"d�Z#e�"d�Z$dZ%dZ&dZ'dZ(dZ)dZ*d Z+e*d!Z,d"Z-e.�Z/e/�0e%�e/�0e&�e/�0e(�e/�0e*�e/�0e,�e�"d#�Z1d$d%�Z2d&d'�Z3d(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;dd?d@dAdBdCdDdEdF�Z4dGZ5dHZ6dIZ7dJZ8dKZ9dLZ:dMZ;e<�Z=e�"dN�Z>dXdPdQ�Z?GdRdS�dSe<�Z@dTZAdUZBdVZCGdWd�de<�ZDdS)YzImplementation of the Metadata for Python packages PEPs. Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental). �)�unicode_literalsN)�message_from_file�)�DistlibException� __version__)�StringIO� string_types� text_type)� interpret)�extract_by_key� get_extras)� get_scheme�PEP440_VERSION_REc@seZdZdZdS)�MetadataMissingErrorzA required metadata is missingN��__name__� __module__� __qualname__�__doc__�rr�@/usr/lib/python3.8/site-packages/pip/_vendor/distlib/metadata.pyrsrc@seZdZdZdS)�MetadataConflictErrorz>Attempt to read or write metadata fields that are conflictual.Nrrrrrr src@seZdZdZdS)� MetadataUnrecognizedVersionErrorz Unknown metadata version number.Nrrrrrr$src@seZdZdZdS)�MetadataInvalidErrorzA metadata value is invalidNrrrrrr(sr�Metadata�PKG_INFO_ENCODING�PKG_INFO_PREFERRED_VERSION�utf-8�1.1z \|� ) �Metadata-Version�Name�Version�Platform�Summary� Description�Keywords� Home-page�Author� Author-email�License)r r!r"r#�Supported-Platformr$r%r&r'r(r)r*� Classifier� Download-URL� Obsoletes�Provides�Requires)r.r/r0r,r-)r r!r"r#r+r$r%r&r'r(r)� Maintainer�Maintainer-emailr*r,r-�Obsoletes-Dist� Project-URL� Provides-Dist� Requires-Dist�Requires-Python�Requires-External)r5r6r7r3r8r1r2r4)r r!r"r#r+r$r%r&r'r(r)r1r2r*r,r-r3r4r5r6r7r8�Private-Version� Obsoleted-By�Setup-Requires-Dist� Extension�Provides-Extra)r9r=r:r;r<)�Description-Content-Typer0r/)r>z"extra\s*==\s*("([^"]+)"|'([^']+)')cCsL|dkr tS|dkrtS|dkr$tS|dkr4ttS|dkr@tSt|��dS)N�1.0r�1.2)�1.3�2.1�2.0)� _241_FIELDS� _314_FIELDS� _345_FIELDS� _566_FIELDS� _426_FIELDSr)�versionrrr�_version2fieldlistpsrJc CsBdd�}g}|��D]"\}}|gddfkr,q|�|�qddddd d g}|D]�}|tkrvd|krv|�d�t�d |�|tkr�d|kr�|�d�t�d |�|tkr�d|kr�|�d�t�d |�|tkr�d|kr�|�d�t�d|�|tk�rd |k�r|dk�r|�d �t�d|�|t krLd |krL|�d �t�d|�qLt |�dk�rZ|dSt |�dk�r|t�d|�t d��d|k�o�||t �}d|k�o�||t �}d |k�o�||t�}d |k�o�||t�} t|�t|�t|�t| �dk�r�t d��|�s |�s |�s | �s t|k�r tS|�r*dS|�r4dS|�r>d Sd S)z5Detect the best version depending on the fields used.cSs|D]}||krdSqdS)NTFr)�keys�markers�markerrrr� _has_marker�sz"_best_version.._has_marker�UNKNOWNNr?rr@rArCrBzRemoved 1.0 due to %szRemoved 1.1 due to %szRemoved 1.2 due to %szRemoved 1.3 due to %sr%zRemoved 2.1 due to %szRemoved 2.0 due to %srrz)Out of options - unknown metadata set: %szUnknown metadata setz,You used incompatible 1.1/1.2/2.0/2.1 fields)�items�appendrD�remove�logger�debugrErFrGrH�lenr� _314_MARKERS� _345_MARKERS� _566_MARKERS� _426_MARKERS�intr) �fieldsrNrK�key�valueZpossible_versionsZis_1_1Zis_1_2Zis_2_1Zis_2_0rrr� _best_version~s`              & r^r r!r"r#r+r$r%r&r'r(r)r1r2r*r,r-r3r5r6r;r7r8r0r/r.r4r9r:r<r=)�metadata_version�namerI�platformZsupported_platform�summary� description�keywords� home_page�author� author_email� maintainer�maintainer_email�license� classifier� download_url�obsoletes_dist� provides_dist� requires_dist�setup_requires_dist�requires_python�requires_external�requires�provides� obsoletes� project_urlZprivate_versionZ obsoleted_by� extensionZprovides_extra)r6r3r5)r7)r")r#r,r.r0r/r3r5r6r8r4r+r;r=r<)r4)r&)r(r1r$r%z[^A-Za-z0-9.]+FcCs0|r$t�d|�}t�d|�dd��}d||fS)zhReturn the distribution name with version. If for_filename is true, return a filename-escaped form.�-� �.z%s-%s)� _FILESAFE�sub�replace)r`rIZ for_filenamerrr�_get_name_and_version�s r~c@s eZdZdZd?dd�Zdd�Zdd �Zd d �Zd d �Zdd�Z dd�Z dd�Z dd�Z dd�Z dd�Zd@dd�Zdd�Zdd �Zd!d"�Zd#d$�ZdAd%d&�ZdBd'd(�ZdCd)d*�Zd+d,�Zefd-d.�ZdDd/d0�ZdEd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Z d=d>�Z!dS)F�LegacyMetadataaaThe legacy metadata of a release. Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can instantiate the class with one of these arguments (or none): - *path*, the path to a metadata file - *fileobj* give a file-like object with metadata as content - *mapping* is a dict-like object - *scheme* is a version scheme name N�defaultcCsz|||g�d�dkrtd��i|_g|_d|_||_|dk rH|�|�n.|dk r\|�|�n|dk rv|�|�|� �dS)N��'path, fileobj and mapping are exclusive) �count� TypeError�_fieldsZrequires_filesZ _dependencies�scheme�read� read_file�update�set_metadata_version)�self�path�fileobj�mappingr�rrr�__init__s   zLegacyMetadata.__init__cCst|j�|jd<dS�Nr )r^r��r�rrrr�"sz#LegacyMetadata.set_metadata_versioncCs|�d||f�dS)Nz%s: %s )�write)r�r�r`r]rrr� _write_field%szLegacyMetadata._write_fieldcCs |�|�S�N)�get�r�r`rrr� __getitem__(szLegacyMetadata.__getitem__cCs |�||�Sr�)�set)r�r`r]rrr� __setitem__+szLegacyMetadata.__setitem__cCs8|�|�}z |j|=Wntk r2t|��YnXdSr�)� _convert_namer��KeyError)r�r`� field_namerrr� __delitem__.s   zLegacyMetadata.__delitem__cCs||jkp|�|�|jkSr�)r�r�r�rrr� __contains__5s �zLegacyMetadata.__contains__cCs(|tkr |S|�dd���}t�||�S)Nrx�_)� _ALL_FIELDSr}�lower� _ATTR2FIELDr�r�rrrr�9szLegacyMetadata._convert_namecCs|tks|tkrgSdS)NrO)� _LISTFIELDS�_ELEMENTSFIELDr�rrr�_default_value?szLegacyMetadata._default_valuecCs&|jdkrt�d|�St�d|�SdS)N�r?r� )r_�_LINE_PREFIX_PRE_1_2r|�_LINE_PREFIX_1_2�r�r]rrr�_remove_line_prefixDs  z"LegacyMetadata._remove_line_prefixcCs|tkr||St|��dSr�)r��AttributeErrorr�rrr� __getattr__JszLegacyMetadata.__getattr__FcCst|d|d|�S)zhReturn the distribution name with version. If filesafe is true, return a filename-escaped form.r!r")r~)r�Zfilesaferrr� get_fullnameUszLegacyMetadata.get_fullnamecCs|�|�}|tkS)z+return True if name is a valid metadata key)r�r�r�rrr�is_field[s zLegacyMetadata.is_fieldcCs|�|�}|tkSr�)r�r�r�rrr�is_multi_field`s zLegacyMetadata.is_multi_fieldcCs.tj|ddd�}z|�|�W5|��XdS)z*Read the metadata values from a file path.�rr��encodingN)�codecs�open�closer�)r��filepath�fprrrr�dszLegacyMetadata.readcCs�t|�}|d|jd<tD]p}||kr(q|tkrf|�|�}|tkrX|dk rXdd�|D�}|�||�q||}|dk r|dkr|�||�qdS)z,Read the metadata values from a file object.zmetadata-versionr NcSsg|]}t|�d���qS��,)�tuple�split��.0r]rrr� ysz,LegacyMetadata.read_file..rO)rr�r�r�Zget_all�_LISTTUPLEFIELDSr�)r�Zfileob�msg�field�valuesr]rrrr�ls zLegacyMetadata.read_filecCs0tj|ddd�}z|�||�W5|��XdS)z&Write the metadata fields to filepath.�wrr�N)r�r�r�� write_file)r�r�� skip_unknownr�rrrr��szLegacyMetadata.writecCs�|��t|d�D]�}|�|�}|r8|dgdgfkr8q|tkrV|�||d�|��q|tkr�|dkr�|jdkr~|�dd�}n |�dd�}|g}|t kr�d d �|D�}|D]}|�|||�q�qd S) z0Write the PKG-INFO format data to a file object.r rOr�r%r�r�rz |cSsg|]}d�|��qSr���joinr�rrrr��sz-LegacyMetadata.write_file..N) r�rJr�r�r�r�r�r_r}r�)r�Z fileobjectr�r�r�r]rrrr��s$   zLegacyMetadata.write_filec sv�fdd�}|sn@t|d�r:|��D]}||||�q$n|D]\}}|||�q>|rr|��D]\}}|||�q^dS)a�Set metadata values from the given iterable `other` and kwargs. Behavior is like `dict.update`: If `other` has a ``keys`` method, they are looped over and ``self[key]`` is assigned ``other[key]``. Else, ``other`` is an iterable of ``(key, value)`` iterables. Keys that don't match a metadata field or that have an empty value are dropped. cs"|tkr|r����|�|�dSr�)r�r�r�)r\r]r�rr�_set�s z#LegacyMetadata.update.._setrKN)�hasattrrKrP)r��other�kwargsr��k�vrr�rr��s     zLegacyMetadata.updatecCsh|�|�}|tks|dkrNt|ttf�sNt|t�rHdd�|�d�D�}qzg}n,|tkrzt|ttf�szt|t�rv|g}ng}t� t j ��r<|d}t |j �}|tkr�|dk r�|D](}|�|�d�d�s�t�d |||�q�nb|tk�r |dk �r |�|��s.r�r!N�;rz$'%s': '%s' is not valid (field '%s')z.'%s': '%s' is not a valid version (field '%s')r%)r�r�� isinstance�listr�rr�r�rSZ isEnabledFor�loggingZWARNINGr r��_PREDICATE_FIELDS�is_valid_matcher�warning�_VERSIONS_FIELDS�is_valid_constraint_list�_VERSION_FIELDS�is_valid_version�_UNICODEFIELDSr�r�)r�r`r]Z project_namer�r�rrrr��sV  �  �  � � �   zLegacyMetadata.setcCs�|�|�}||jkr*|tkr&|�|�}|S|tkr@|j|}|S|tkr�|j|}|dkr^gSg}|D].}|tkr~|�|�qf|�|d|df�qf|S|tkr�|j|}t |t �r�|� d�S|j|S)zGet a metadata field.Nrrr�) r�r��_MISSINGr�r�r�r�rQr�r�rr�)r�r`r�r]�res�valrrrr��s.         zLegacyMetadata.getc s�|��gg}}dD]}||kr|�|�q|rP|gkrPdd�|�}t|��dD]}||krT|�|�qT|ddkr�||fSt|j���fdd�}t|ft�jft �j ffD]@\}}|D]2} |� | d �} | d k r�|| �s�|�d | | f�q�q�||fS) zkCheck if the metadata is compliant. If strict is True then raise if no Name or Version are provided)r!r"zmissing required metadata: %s�, )r'r(r r@cs(|D]}��|�d�d�sdSqdS)Nr�rFT)r�r�)r]r��r�rr�are_valid_constraints#sz3LegacyMetadata.check..are_valid_constraintsNzWrong value for '%s': %s) r�rQr�rr r�r�r�r�r�r�r�) r��strict�missing�warnings�attrr�r�r[Z controllerr�r]rr�r�check s8       ���  zLegacyMetadata.checkcCs�|��d}i}|D]"\}}|r*||jkr||||<q|ddkr�d}|D]B\}}|rb||jkrL|dkrx||||<qLdd�||D�||<qLn8|ddkr�d }|D]"\}}|r�||jkr�||||<q�|S) z�Return fields as a dict. Field names will be converted to use the underscore-lowercase style instead of hyphen-mixed case (i.e. home_page instead of Home-page). ) )r_r )r`r!)rIr")rbr$)rer')rfr()rgr))rjr*)rcr%)rdr&)rar#)� classifiersr,)rlr-r r@))ror6)rqr7)rrr8)rnr5)rmr3)rvr4)rhr1)rir2rvcSsg|]}d�|��qSr�r�)r��urrrr�bsz)LegacyMetadata.todict..r))rtr/)rsr0)rur.)r�r�)r�Z skip_missingZ mapping_1_0�datar\r�Z mapping_1_2Z mapping_1_1rrr�todict5s&     zLegacyMetadata.todictcCs8|ddkr$dD]}||kr||=q|d|7<dS)Nr r)r.r0r/r6r)r�� requirementsr�rrr�add_requirementsps  zLegacyMetadata.add_requirementscCstt|d��Sr�)r�rJr�rrrrK{szLegacyMetadata.keysccs|��D] }|VqdSr��rK)r�r\rrr�__iter__~s zLegacyMetadata.__iter__cs�fdd����D�S)Ncsg|] }�|�qSrr�r�r\r�rrr��sz)LegacyMetadata.values..r�r�rr�rr��szLegacyMetadata.valuescs�fdd����D�S)Ncsg|]}|�|f�qSrrr�r�rrr��sz(LegacyMetadata.items..r�r�rr�rrP�szLegacyMetadata.itemscCsd|jj|j|jfS)Nz <%s %s %s>)� __class__rr`rIr�rrr�__repr__�s �zLegacyMetadata.__repr__)NNNr�)F)F)F)N)F)F)"rrrrr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rKr�r�rPr�rrrrrs@ �     ,  , ; rz pydist.jsonz metadata.jsonZMETADATAc@s�eZdZdZe�d�Ze�dej�Ze Z e�d�Z dZ de Zdddd �Zd Zd Zedfedfe dfe dfd �Zd ZdDdd�Zed�ZdefZdefZdefdefeeedefeeeedefddd� Z[[dd�ZdEdd�Zdd�Zed d!��Z ed"d#��Z!e!j"d$d#��Z!dFd%d&�Z#ed'd(��Z$ed)d*��Z%e%j"d+d*��Z%d,d-�Z&d.d/�Z'd0d1�Z(d2d3�Z)d4d5d6d7d8dd9�Z*d:d;�Z+dGd>d?�Z,d@dA�Z-dBdC�Z.dS)Hrz� The metadata of a release. This implementation uses 2.0 (JSON) metadata where possible. If not possible, it wraps a LegacyMetadata instance which handles the key-value metadata format. z ^\d+(\.\d+)*$z!^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$z .{1,2047}rCz distlib (%s)r)�legacy)r`rIrbzqname version license summary description author author_email keywords platform home_page classifiers download_urlzwextras run_requires test_requires build_requires dev_requires provides meta_requires obsoleted_by supports_environments)r_r`rIrb)�_legacy�_datar�Nr�c Cs0|||g�d�dkrtd��d|_d|_||_|dk rzz|�||�||_Wn*tk rvt||d�|_|��YnXn�d}|r�t |d��}|� �}W5QRXn |r�|� �}|dkr�|j |j d�|_ndt |t�s�|�d�}zt�|�|_|�|j|�Wn0tk �r*tt|�|d�|_|��YnXdS)Nr�r�)r�r��rb�r_� generatorr)r�r�)r�r�r�r�r��_validate_mappingrr�validater�r��METADATA_VERSION� GENERATORr�r �decode�json�loads� ValueErrorr)r�r�r�r�r�r��frrrr��s@   �    �zMetadata.__init__)r`rIrjrdrbr6r;r=r,)r-N)r N) � run_requires�build_requires� dev_requiresZ test_requires� meta_requires�extras�modules� namespaces�exports�commandsr�Z source_urlr_c CsXt�|d�}t�|d�}||k�r||\}}|jr^|dkrP|dkrHdn|�}n |j�|�}n�|dkrjdn|�}|dkr�|j�||�}n�t�}|}|j�d�} | �r |dkr�| �d|�}nP|dkr�| �d�} | r�| �||�}n,| �d �} | s�|j�d �} | �r | �||�}||k�rT|}n:||k�r2t�||�}n"|j�rH|j�|�}n |j�|�}|S) N� common_keys� mapped_keys�r rrrr�� extensionsr �python.commandsr��python.details�python.exports)�object�__getattribute__r�r�r�) r�r\�common�mapped�lkZmaker�resultr]�sentinel�drrrrsD            zMetadata.__getattribute__cCsH||jkrD|j|\}}|p |j|krD|�|�}|sDtd||f��dS)Nz.'%s' is an invalid value for the '%s' property)�SYNTAX_VALIDATORSr��matchr)r�r\r]r��pattern� exclusions�mrrr�_validate_value+s  ��zMetadata._validate_valuecCs*|�||�t�|d�}t�|d�}||kr�||\}}|jrV|dkrJt�||j|<nf|dkrj||j|<nR|j�di�}|dkr�||d<n2|dkr�|�di�}|||<n|�d i�}|||<nh||kr�t�|||�nP|d k�rt|t ��r|� �}|�r|� �}ng}|j�r||j|<n ||j|<dS) Nr r r r r rr�rrrd) rrrr��NotImplementedErrorr�� setdefault� __setattr__r�rr�r�)r�r\r]rrrr�rrrrr!5s<               zMetadata.__setattr__cCst|j|jd�S�NT)r~r`rIr�rrr�name_and_version\szMetadata.name_and_versioncCsF|jr|jd}n|j�dg�}d|j|jf}||krB|�|�|S)Nr5rtz%s (%s))r�r�r r`rIrQ)r�r�srrrrt`s  zMetadata.providescCs |jr||jd<n ||jd<dS)Nr5rt)r�r�r�rrrrtks c Cs�|jr |}n�g}t|pg|j�}|D]d}d|kr>d|kr>d}n8d|krLd}n|�d�|k}|rv|�d�}|rvt||�}|r$|�|d�q$dD]F}d|} | |kr�|�| �|j�d|g�}|�|j|||d��q�|S) a� Base method to get dependencies, given a set of extras to satisfy and an optional environment context. :param reqts: A list of sometimes-wanted dependencies, perhaps dependent on extras and environment. :param extras: A list of optional components being requested. :param env: An optional environment for marker evaluation. �extra� environmentTrs)ZbuildZdevZtestz:%s:z %s_requires)r�env) r�r rr�r �extendrRr��get_requirements) r��reqtsrr'rrZincluderMr\�errrr)rs2     � zMetadata.get_requirementscCs|jr|��S|jSr�)r�� _from_legacyr�r�rrr� dictionary�szMetadata.dictionarycCs|jr t�nt|j|j�SdSr�)r�rr r��DEPENDENCY_KEYSr�rrr� dependencies�szMetadata.dependenciescCs|jr t�n |j�|�dSr�)r�rr�r�r�rrrr/�sc Cs�|�d�|jkrt��g}|j��D]"\}}||kr$||kr$|�|�q$|rbdd�|�}t|��|��D]\}}|�|||�qjdS)Nr_zMissing metadata items: %sr�) r�r�r�MANDATORY_KEYSrPrQr�rr) r�r�r�r�r\rr�r�r�rrrr��s zMetadata._validate_mappingcCsB|jr.|j�d�\}}|s|r>t�d||�n|�|j|j�dS)NTz#Metadata: missing: %s, warnings: %s)r�r�rSr�r�r�r�)r�r�r�rrrr��s�zMetadata.validatecCs(|jr|j�d�St|j|j�}|SdSr")r�r�r r�� INDEX_KEYS)r�rrrrr��s zMetadata.todictc Cs�|j|jd�}|j�d�}dD]*}||kr|dkr8d}n|}||||<q|�dg�}|dgkrdg}||d<d }|D]*\}}||krt||rtd ||ig||<qt|j|d <i}i} |S) Nr�T)r`rIrjrbrcrkrkr�r&�rd))ror)rprrsrt)r�r�r�r�r�rt) r�rZlmdr��nk�kwrK�okrfrhrrrr,�s,�     zMetadata._from_legacyr!r"r*r$r%)r`rIrjrbrcr�cCs�dd�}t�}|j}|j��D]\}}||kr||||<q||j|j�}||j|j�}|jrpt |j�|d<t |�|d<t |�|d<|S)NcSs�t�}|D]|}|�d�}|�d�}|d}|D]V}|sF|sF|�|�q.d}|rVd|}|rp|rld||f}n|}|�d�||f��q.q |S)Nr%r&rsr2z extra == "%s"z (%s) and %sr�)r�r��addr�)�entriesr*r+r%r'Zrlistr�rMrrr�process_entries�s"   z,Metadata._to_legacy..process_entriesr=r6r;) rr��LEGACY_MAPPINGrPrrrrr�sorted)r�r8rZnmdr3r5Zr1Zr2rrr� _to_legacy�s  zMetadata._to_legacyFTc Cs�||g�d�dkrtd��|��|r`|jr4|j}n|��}|rP|j||d�q�|j||d�n^|jrp|��}n|j}|r�t j ||dddd�n.t � |dd��}t j ||dddd�W5QRXdS) Nrz)Exactly one of path and fileobj is needed)r�Tr�)Z ensure_ascii�indentZ sort_keysr�r) r�r�r�r�r;r�r�r,r�r��dumpr�r�)r�r�r�r�r�Z legacy_mdrrrrrr�s*  � �zMetadata.writecCs�|jr|j�|�nr|j�dg�}d}|D]}d|kr*d|kr*|}qHq*|dkrfd|i}|�d|�n t|d�t|�B}t|�|d<dS)Nrr&r%rsr)r�r�r�r �insertr�r:)r�r�r�always�entryZrsetrrrr�3szMetadata.add_requirementscCs*|jpd}|jpd}d|jj|j||fS)Nz (no name)z no versionz<%s %s %s (%s)>)r`rIr�rr_)r�r`rIrrrr�Ds  �zMetadata.__repr__)NNNr�)N)NN)NNFT)/rrrr�re�compileZMETADATA_VERSION_MATCHER�IZ NAME_MATCHERrZVERSION_MATCHERZSUMMARY_MATCHERr�rr�r0r1r.r� __slots__r�r�r r�Z none_list�dictZ none_dictr rrr!�propertyr#rt�setterr)r-r/r�r�r�r,r9r;r�r�r�rrrrr�s�  ��� -�+ '    *    � % )F)ErZ __future__rr�Zemailrr�r�rAr2rr�compatrrr rLr �utilr r rIr rZ getLoggerrrSrrrr�__all__rrrBr�r�rDrErVrFrWrHrYrGrXr�r�r�ZEXTRA_RErJr^r�r�r�r�r�r�r�r�rr�r{r~rZMETADATA_FILENAMEZWHEEL_METADATA_FILENAMEZLEGACY_METADATA_FILENAMErrrrr�s�              H�!