o
    5ivF                     @  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sJ 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 sJ 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
