o
    5‘ðivF  ã                   @  sÞ  d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlZd dlZd dlmZ d dlmZ d dlmZmZ d dlmZm Z  d dl!m"Z" ddl#m$Z$m%Z% e&ddddddddgd�Z'ej( )dej*dddd�ej*ddd d�ej*d!dd"d�ej*d#d$d%d�ej*d&d'd(d�f¡d)d*„ ƒZ+d+d,„ Z,ej( )d-e,ƒ ¡d.d/„ ƒZ-d0d1„ Z.ej( )d-e.ƒ ¡d2d3„ ƒZ/G d4d5„ d5ƒZ0G d6d7„ d7ƒZ1d8d9„ Z2dGd<d=„Z3dHdId?d@„Z4dJdEdF„Z5dS )Ké    )ÚannotationsN)Úmessage_from_string)Ú	Generator)ÚEmailMessage)ÚParser)ÚEmailPolicy)Úcleandoc)ÚPath)ÚMock)ÚMetadata)Úsic)Úrfc822_escapeÚrfc822_unescape)ÚexpandÚsetupcfg)ÚDistributioné   )Úretrieve_fileÚurls_from_fileÚpackagez0.0.1zFoo Barzfoo@bar.netzLong
descriptionzShort descriptionÚoneÚtwo)ÚnameÚversionÚauthorÚauthor_emailÚlong_descriptionÚdescriptionÚkeywords©ÚcontentÚresultzJust a single lineÚsingle_line)Úidz%Multiline
Text
without
extra indents
Ú	multilinez,Multiline
    With

additional
  indentationÚmultiline_with_indentationz  Leading whitespacezLeading whitespaceÚremove_leading_whitespacez-  Leading whitespace
In
    Multiline commentz+Leading whitespace
In
    Multiline commentÚ#remove_leading_whitespace_multilinec                 C  s   |p| t t| ƒƒksJ ‚d S ©N)r   r   r   © r)   úb/root/parts/websockify/install/lib/python3.10/site-packages/setuptools/tests/test_core_metadata.pyÚtest_rfc822_unescape$   s   r+   c                  C  sú   t } t t| ¡}d|ƒ fd|dd�fd|g d¢d�fd|d	d
�fd|dd�ftjd|tdd�d�tjjdd�d�d|dd�fd|dd�fd|dd�ftjd|ddgd �tjjd!d�d�d"tdd#d$d%�fd&tdd#d'd(�fd)tdd#d*�fd+tdtd,ƒd*�fgS )-NzMetadata version 1.0z,Metadata Version 1.0: Short long descriptionzShort long description)r   z!Metadata version 1.1: Classifiers)z#Programming Language :: Python :: 3z%Programming Language :: Python :: 3.7z&License :: OSI Approved :: MIT License)Úclassifiersz"Metadata version 1.1: Download URLzhttps://example.com)Údownload_urlz%Metadata Version 1.2: Requires-Pythonz>=3.7)Úpython_requiresz!Metadata Version 1.2: Project-Urlzhttps://example.bar)ÚFoo)Úproject_urlsz"Issue #1578: project_urls not read)Úreason)Úmarksz3Metadata Version 2.1: Long Description Content Typeztext/x-rst; charset=UTF-8)Úlong_description_content_typeÚLicenseÚMIT)ÚlicensezLicense multilinez+This is a long license 
over multiple linesz$Metadata Version 2.1: Provides ExtraÚfooÚbar)Úprovides_extraszprovides_extras not readzMissing authorz1.0.0zsnorri@sturluson.name)r   r   r   zMissing author e-mailzSnorri Sturluson)r   r   r   zMissing author and e-mail)r   r   zBypass normalized versionz1.0.0a)	ÚEXAMPLE_BASE_INFOÚ	functoolsÚpartialÚdictÚpytestÚparamÚmarkÚxfailr   )ÚbaseÚparamsr)   r)   r*   Ú__read_test_casesF   sš   ÿþÿþÿþÿþÿýÿþÿþÿþýýþ	ýþ	þþþþ­rD   )r   Úattrsc                 C  s  t |ƒ}|j}|j}t ¡ }| |¡ | d¡ | ¡ }t|ƒs"J ‚| d¡ |ƒ }| 	|¡ d|j
fd|jfd|jfd|jfd|jfd|jfd|jfd	|jfd
|jfd|jfd|jfd|jfd|jfd|jfddd„ fddd„ fg}|D ]\}	}
|
|ƒ|
|ƒksƒJ ‚qud S )Nr   r   r   r   r   Úmetadata_versionÚprovidesr   r   r-   r   Ú	platformsÚ	obsoletesÚrequiresr,   r0   c                 S  ó   t | di ƒS )Nr0   ©Úgetattr©Úsr)   r)   r*   Ú<lambda>É   ó    z$test_read_metadata.<locals>.<lambda>r9   c                 S  rK   )Nr9   rL   rN   r)   r)   r*   rP   Ê   rQ   )r   ÚmetadataÚ	__class__ÚioÚStringIOÚwrite_pkg_fileÚseekÚreadÚ_valid_metadataÚread_pkg_fileÚget_nameÚget_versionÚget_contactÚget_contact_emailÚget_metadata_versionÚget_providesÚget_descriptionÚget_long_descriptionÚget_download_urlÚget_keywordsÚget_platformsÚget_obsoletesÚget_requiresÚget_classifiers)r   rE   ÚdistÚmetadata_outÚ
dist_classÚPKG_INFOÚpkg_infoÚmetadata_inÚtested_attrsÚattrÚgetterr)   r)   r*   Útest_read_metadata¨   s>   





ðÿrr   c                  C  sÀ   ddddœ} dd„ }d|   ¡ fd|| d	d
iƒfd|| d
ddœƒfd|| ddiƒfd|| dddœƒfd|| d
ddœƒfd|| d
ddddœƒfd|| dddœƒfd|| d	diƒfd|| ddiƒfg
S )Nr   z1.0Úxxx)r   r   r   c                 S  s   |   ¡ } |  |¡ | S r(   )ÚcopyÚupdate)Úd1Úd2r)   r)   r*   Úmerge_dictsÔ   s   
z,__maintainer_test_cases.<locals>.merge_dictszNo author, no maintainerz!Author (no e-mail), no maintainerr   zAuthor NamezAuthor (e-mail), no maintainerzauthor@name.com)r   r   z!No author, maintainer (no e-mail)Ú
maintainerzMaintainer NamezNo author, maintainer (e-mail)zmaintainer@name.com)ry   Úmaintainer_emailz)Author (no e-mail), Maintainer (no-email))r   ry   z$Author (e-mail), Maintainer (e-mail)©r   r   ry   rz   z*No author (e-mail), no maintainer (e-mail))r   rz   zAuthor unicodeu	   é‰„æ²¢å¯›zMaintainer unicodeu   Jan Å�ukasiewicz)rt   )rE   rx   r)   r)   r*   Ú__maintainer_test_casesÑ   s`   
þ
ÿþþþþþ
ÿþüþþþþþ
Ér|   c                 C  s  dddddœ}t |ƒ}| d¡}t|ƒ}|j |¡ tt| d¡ƒdd	d
��}| ¡ }W d   ƒ n1 s5w   Y  t|ƒs@J ‚| 	¡ }	t
td |	d d… ƒƒ}
t|
ƒ}t|
ƒt|ƒks]J ‚| ¡ D ]*\}}| |d ¡}|d u r~|
D ]}| |d ¡r|J ‚qqqa|› d|› �}||v s‹J ‚qad S )NÚAuthorzAuthor-emailÚ
MaintainerzMaintainer-emailr{   rm   zPKG-INFOÚrúutf-8©Úencodingéþÿÿÿú:z: )r   ÚmkdirÚstrrR   Úwrite_pkg_infoÚopenÚjoinrX   rY   Ú
splitlinesÚlistÚfilterÚsetÚlenÚitemsÚgetÚ
startswith)r   rE   ÚtmpdirÚtested_keysri   ÚfnÚfn_sÚfrm   Úraw_pkg_linesÚ	pkg_linesÚpkg_lines_setÚfkeyÚdkeyÚvalÚliner)   r)   r*   Útest_maintainer_author  s4   ü

ÿÿùrž   c                   @  s\   e Zd Zdd„ Zdd„ ZeeƒjZed Z	e
jdgee	ƒ¢d�dd	„ ƒZe
jjd
d„ ƒZdS )Ú#TestParityWithMetadataFromPyPaWheelc                 C  s(   t di t¤dddg dœdœ¤Ž}t|ƒS )Nz>=3.8a,  
            packaging==23.2
            more-itertools==8.8.0; extra == "other"
            jaraco.text==3.7.0
            importlib-resources==5.10.2; python_version<"3.8"
            importlib-metadata==6.0.0 ; python_version<"3.8"
            colorama>=0.4.4; sys_platform == "win32"
            a  
                    pytest >= 6
                    pytest-checkdocs >= 2.4
                    tomli ; \
                            # Using stdlib when possible
                            python_version < "3.11"
                    ini2toml[lite]>=0.9
                    )ÚtestingÚother)r.   Úinstall_requiresÚextras_requirer)   )r=   r:   r   )ÚselfrE   r)   r)   r*   Úbase_example>  s   ÿ	÷
ôz0TestParityWithMetadataFromPyPaWheel.base_examplec                 C  s>   |   ¡ }t|ƒ}t|ƒsJ ‚g d¢}|D ]}||v sJ ‚qd S )N)zMetadata-Version:zRequires-Python: >=3.8zProvides-Extra: otherzProvides-Extra: testingzDRequires-Dist: tomli; python_version < "3.11" and extra == "testing"z6Requires-Dist: more-itertools==8.8.0; extra == "other"z6Requires-Dist: ini2toml[lite]>=0.9; extra == "testing")r¥   Ú_get_pkginforY   )r¤   Útmp_pathri   rm   Úexpectedr�   r)   r)   r*   Útest_requires_distZ  s   	ÿz6TestParityWithMetadataFromPyPaWheel.test_requires_distzconfig/setupcfg_examples.txtN)rC   c                 c  s€   � |  |¡ | tdtdd�¡ | tdtdd�¡ | tdtdd�¡ |jdu r0|  ¡ V  dS t|jƒ}t 	ti ƒ|¡V  dS )z4Example of distribution with arbitrary configurationÚ	read_attrz0.42)Úreturn_valueÚ
read_filesúhello worldÚ_finalize_license_filesN)
ÚchdirÚsetattrr   r
   r   r?   r¥   r   r   Úapply_configuration)r¤   ÚrequestÚmonkeypatchr§   Úconfigr)   r)   r*   ri   o  s   €
ÿ

z(TestParityWithMetadataFromPyPaWheel.distc           
      C  sÜ   t |ƒ}t |¡�}ttƒ |¡}W d  ƒ n1 sw   Y  tdddd�}t ¡ � }tj|dd�}t	||d� 
|¡ | ¡  | ¡ }W d  ƒ n1 sNw   Y  t|dƒ}	d	 |	 ¡ ¡}	d	 | ¡ ¡}||	kslJ ‚dS )
zAEnsure PKG-INFO round trips according to pypa/wheel's methodologyNTFr   )Úutf8Úmangle_from_Úmax_line_lengthr€   r�   )Úpolicyó   
)r¦   rT   rU   r   r   Úparser   ÚBytesIOÚTextIOWrapperr   ÚflattenÚflushÚgetvalueÚbytesr‰   rŠ   )
r¤   r§   ri   rm   ÚbufferÚmsgÚserialization_policyÚoutÚregeneratedÚraw_metadatar)   r)   r*   Útest_pkg_info_roundtrip  s&   ÿý

ü
z;TestParityWithMetadataFromPyPaWheel.test_pkg_info_roundtrip)Ú__name__Ú
__module__Ú__qualname__r¥   r©   r	   Ú__file__ÚparentÚHEREÚEXAMPLES_FILEr>   Úfixturer   ri   r@   Úuses_networkrÇ   r)   r)   r)   r*   rŸ   =  s    

rŸ   c                   @  s°   e Zd ZedƒedƒdœZej de ¡ ¡dd„ ƒZ	ej de ¡ ¡ej ddd	id
diddddgfidddgfiddddgfdœg¡dd„ ƒƒZ
ej dddg¡dd„ ƒZdS )Ú
TestPEP643a•  
            [metadata]
            name = package
            version = 0.0.1
            author = Foo Bar
            author_email = foo@bar.net
            long_description = Long
                               description
            description = Short description
            keywords = one, two
            platforms = abcd
            [options]
            install_requires = requests
            a  
            [project]
            name = "package"
            version = "0.0.1"
            authors = [
              {name = "Foo Bar", email = "foo@bar.net"}
            ]
            description = "Short description"
            readme = {text = "Long\ndescription", content-type = "text/plain"}
            keywords = ["one", "two"]
            dependencies = ["requests"]
            license = "AGPL-3.0-or-later"
            [tool.setuptools]
            provides = ["abcd"]
            obsoletes = ["abcd"]
            )z	setup.cfgúpyproject.tomlÚfilec                 C  sF   t |ƒj| j| dd� tƒ }| d¡d u sJ ‚| d¡d u s!J ‚d S )Nr€   r�   ÚDynamicÚdynamic)r	   Ú
write_textÚSTATIC_CONFIGÚ_get_metadataÚget_all)r¤   rÓ   Ú
tmpdir_cwdrR   r)   r)   r*   Ú!test_static_config_has_no_dynamicÂ  s   z,TestPEP643.test_static_config_has_no_dynamicÚfieldszrequires-python)r.   z>=3.12zauthor-email)r   zsnoopy@peanuts.comr   ÚhelloÚworldÚplatformrH   Úabcd)r   r­   )r   zbla bla bla blar¢   zhello-world)Úsummaryr   zrequires-distc                 C  sp   t |ƒj| j| dd� tƒ }| ¡ D ]\}}t|||ƒ t|j||ƒ qt|ƒ}t| 	d¡ƒt|ƒks6J ‚d S )Nr€   r�   rÔ   )
r	   rÖ   r×   Ú	_makedistÚvaluesr°   rR   rØ   r�   rÙ   )r¤   rÓ   rÜ   rÚ   ri   rp   ÚvaluerR   r)   r)   r*   Ú&test_modified_fields_marked_as_dynamicÉ  s   z1TestPEP643.test_modified_fields_marked_as_dynamicÚ
extra_tomlz'# Let setuptools autofill license-filesz2license-files = ['LICENSE*', 'AUTHORS*', 'NOTICE']c                 C  s¦   | j d  dd|› �¡ddddœ}||d v sJ ‚d|vsJ ‚tj |¡ tdd	�}t|ƒ}t| d
¡ƒddhks;J ‚| 	d¡dksDJ ‚t| d¡ƒh d£ksQJ ‚d S )NrÒ   zlicense = "AGPL-3.0-or-later"zdynamic = ['license']
z--- mock license ---z--- mock notice ---z
--- me ---)rÒ   ú
LICENSE.mdÚNOTICEúAUTHORS.txtzAGPL-3.0-or-later)Úlicense_expressionrÔ   zlicense-filezlicense-expressionzLicense-ExpressionzLicense-File>   rè   rç   ré   )
r×   ÚreplaceÚjaracoÚpathÚbuildrâ   rØ   r�   rÙ   r�   )r¤   ræ   rÚ   Úfilesri   rR   r)   r)   r*   Útest_license_files_dynamicë  s&   
þù


þz%TestPEP643.test_license_files_dynamicN)rÈ   rÉ   rÊ   r   r×   r>   r@   ÚparametrizeÚkeysrÛ   rå   rð   r)   r)   r)   r*   rÑ   œ  s>    ÿÿï%
ýùþþþrÑ   c                  K  s   t | ƒ}| ¡  |S r(   )r   Úparse_config_files)rE   ri   r)   r)   r*   râ     s   râ   ri   r   c                 C  s@   t  ¡ �}| j |¡ | ¡ W  d   ƒ S 1 sw   Y  d S r(   )rT   rU   rR   rV   r¿   )ri   Úfpr)   r)   r*   r¦     s   
$þr¦   úDistribution | Nonec                 C  s   t t| ptƒ ƒƒS r(   )r   r¦   râ   )ri   r)   r)   r*   rØ      s   rØ   Útextr†   ÚreturnÚboolc                 C  s   t j| dd�}|d uS )NT)Úvalidate)r   Ú
from_email)rö   rR   r)   r)   r*   rY   $  s   rY   )ri   r   r(   )ri   rõ   )rö   r†   r÷   rø   )6Ú
__future__r   r;   rT   Úemailr   Úemail.generatorr   Úemail.messager   Úemail.parserr   Úemail.policyr   Úinspectr   Úpathlibr	   Úunittest.mockr
   Újaraco.pathrì   r>   Úpackaging.metadatar   Ú
setuptoolsr   Úsetuptools._core_metadatar   r   Úsetuptools.configr   r   Úsetuptools.distr   Úconfig.downloadsr   r   r=   r:   r@   rñ   r?   r+   rD   rr   r|   rž   rŸ   rÑ   râ   r¦   rØ   rY   r)   r)   r)   r*   Ú<module>   sŒ    ùýýýýýëþ
b
(D
'_x
