o
    !gJ                     @  s   d dl mZ d dl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 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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"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j0dddd ej0d!dd"d ej0d#dd$d ej0d%d&d'd ej0d(d)d*d fd+d, Z1d-d. Z2ej./d/e2 d0d1 Z3d2d3 Z4ej./d/e4 d4d5 Z5G d6d7 d7Z6G d8d9 d9Z7d:d; Z8dWd@dAZ9dXdDdEZ:dYdJdKZ;dZdNdOZ<d[d\dQdRZ=d]dUdVZ>dS )^    )annotationsN)message_from_string)	Generator)EmailMessageMessage)Parser)EmailPolicy)cleandoc)Path)Mock)Metadata)Requirement)_reqssic)rfc822_escaperfc822_unescape)egg_infowrite_requirements)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   r0   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_casesH   s   		rI   )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!   r2   r#   	platforms	obsoletesrequiresr1   r5   c                 S     t | di S )Nr5   getattrsr.   r.   r/   <lambda>       z$test_read_metadata.<locals>.<lambda>r>   c                 S  rP   )Nr>   rQ   rS   r.   r.   r/   rU      rV   )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   rJ   distmetadata_out
dist_classPKG_INFOpkg_infometadata_intested_attrsattrgetterr.   r.   r/   test_read_metadata   s>   





rw   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)r~   maintainer_emailz)Author (no e-mail), Maintainer (no-email))r   r~   z$Author (e-mail), Maintainer (e-mail)r   r    r~   r   z*No author (e-mail), no maintainer (e-mail))r    r   zAuthor unicodeu	   鉄沢寛zMaintainer unicodeu   Jan Łukasiewicz)ry   )rJ   r}   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   rr   PKG-INFOrutf-8encoding:z: )r   mkdirstrrW   write_pkg_infoopenjoinr]   r^   
splitlineslistfiltersetlenitemsget
startswith)r   rJ   tmpdirtested_keysrn   fnfn_sfrr   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)r3   install_requiresextras_requirer.   )rB   r?   r   )selfrJ   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_pkginfor^   )r   tmp_pathrn   rr   expectedr   r.   r.   r/   test_requires_dist\  s   	z6TestParityWithMetadataFromPyPaWheel.test_requires_distzconfig/setupcfg_examples.txtN)rH   c                 c  sl    | | |tdtdd |tdtdd |jdu r&|  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 worldN)
chdirsetattrr   r   rD   r   r   r   apply_configurationr   )r   requestmonkeypatchr   configr.   r.   r/   rn   q  s   


z(TestParityWithMetadataFromPyPaWheel.distc                 C  s   t d}t|dd}|du rtd t|}|d }|jdd |d j|d	d
 tt	|||d  |||d }t
|}t|}	t
|	}
||
ksNJ t| dS )zHEnsure output from setuptools is equivalent to the one from `pypa/wheel`zwheel.metadatapkginfo_to_metadataNzjwheel.metadata.pkginfo_to_metadata is undefined, (this is likely to be caused by API changes in pypa/wheelzpkg.egg-infoT)parentsr   r   r   zrequires.txt)	importlibimport_modulerR   rC   rF   r   r   
write_textr   r   _normalize_metadatar   _assert_roundtrip_message)r   r   rn   wheel_metadatar   rr   egg_info_dirmetadata_msgmetadata_strpkg_info_msgpkg_info_strr.   r.   r/   test_equivalent_output~  s"   
z:TestParityWithMetadataFromPyPaWheel.test_equivalent_output)__name__
__module____qualname__r   r   r
   __file__parentHEREEXAMPLES_FILErC   fixturer   rn   rE   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
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"]
            [tool.setuptools]
            provides = ["abcd"]
            obsoletes = ["abcd"]
            )z	setup.cfgz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
   r   STATIC_CONFIG_get_metadataget_all)r   r   
tmpdir_cwdrW   r.   r.   r/   !test_static_config_has_no_dynamic  s   z,TestPEP643.test_static_config_has_no_dynamicfieldszrequires-python)r3   z>=3.12zauthor-email)r    zsnoopy@peanuts.comr#   helloworldplatformrM   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   rW   r   r   r   )r   r   r   r   rn   ru   valuerW   r.   r.   r/   &test_modified_fields_marked_as_dynamic  s   z1TestPEP643.test_modified_fields_marked_as_dynamicN)r   r   r   r	   r   rC   rE   parametrizekeysr   r   r.   r.   r.   r/   r     s0    $
r   c                  K  s   t | }|  |S r-   )r   parse_config_files)rJ   rn   r.   r.   r/   r     s   r   rW   r   returnNonec                 C  s   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 sJw   Y  t| d}d	| }d	| }||kshJ dS )
zEmulate the way wheel.bdist_wheel parses and regenerates the message,
    then ensures the metadata generated by setuptools is compatible.
    NTFr   )utf8mangle_from_max_line_lengthr   r   )policy   
)rY   rZ   r   r   parser   BytesIOTextIOWrapperr   flattenflushgetvaluebytesr   r   )rW   buffermsgserialization_policyoutregeneratedraw_metadatar.   r.   r/   r     s$   


r   r   r   c                   s|   dd |  dg D   fddt|  dg D }| d= | d= t|D ]}|| d< q%t D ]}|| d< q0| d= |  S )z1Allow equivalent metadata to be compared directlyc                 S  s   i | ]	}| d d|qS )_-)replace).0xr.   r.   r/   
<dictcomp>  s    z'_normalize_metadata.<locals>.<dictcomp>zProvides-Extrac                   s   g | ]}t | qS r.   )_normalize_req)r   reqextrasr.   r/   
<listcomp>  s    z'_normalize_metadata.<locals>.<listcomp>zRequires-DistzMetadata-Version)r   r   r   sorted	as_string)r   reqsr  extrar.   r  r/   r     s   


r   r  r   r  dict[str, str]c                 C  s>   t | | j| jdd}| D ]
\}}|||}q|S )z<Allow equivalent requirement objects to be compared directlyr   r   )r   r   r   r   )r  r  as_strnormorigr.   r.   r/   r  -  s   r  rn   r   c                 C  s@   t  }| j| | W  d    S 1 sw   Y  d S r-   )rY   rZ   rW   r[   r   )rn   fpr.   r.   r/   r   5  s   
$r   Distribution | Nonec                 C  s   t t| pt S r-   )r   r   r   )rn   r.   r.   r/   r   ;  s   r   textboolc                 C  s   t j| dd}|d uS )NT)validate)r   
from_email)r  rW   r.   r.   r/   r^   ?  s   r^   )rW   r   r   r   )r   r   r   r   )r  r   r  r
  r   r   )rn   r   r-   )rn   r  )r  r   r   r  )?
__future__r   r@   r   rY   emailr   email.generatorr   email.messager   r   email.parserr   email.policyr   inspectr	   pathlibr
   unittest.mockr   rC   packaging.metadatar   packaging.requirementsr   
setuptoolsr   r   setuptools._core_metadatar   r   setuptools.command.egg_infor   r   setuptools.configr   r   setuptools.distr   config.downloadsr   r   rB   r?   rE   r   rD   r0   rI   rw   r   r   r   r   r   r   r   r  r   r   r^   r.   r.   r.   r/   <module>   s    
b
(D
'`O


 
