U
    aÊ¹j:K  ã                   @  s  d Z 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 ddl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mZmZ ddlmZmZ ddlmZ ddlmZ ddlm Z m!Z! e	e"ƒj#Z$dZ%dd„ Z&ej' (de!e$e% ƒ¡ej' )d¡ej'j*dd„ ƒƒƒZ+dZ,dZ-dZ.de,fdd„Z/dd„ Z0ej' (dd d!d"g¡d#d$„ ƒZ1d%d&„ Z2d'd(„ Z3ej' (d)ej4e,d*d+d,�ej4e-d-ej'j5d.d/d0�d1d2�f¡d3d4„ ƒZ6G d5d6„ d6ƒZ7G d7d8„ d8ƒZ8G d9d:„ d:ƒZ9G d;d<„ d<ƒZ:G d=d>„ d>ƒZ;G d?d@„ d@ƒZ<G dAdB„ dBƒZ=dCdDœdEdF„Z>dS )GzÍMake sure that applying the configuration from pyproject.toml is equivalent to
applying a similar configuration from setup.cfg

To run these tests offline, please have a look on ``./downloads/preload.py``
é    )ÚannotationsN)Úcleandoc)ÚPath)ÚMock)ÚLiteTranslator)ÚMetadata)Úwrite_requirements)ÚexpandÚpyprojecttomlÚsetupcfg)Ú_MissingDynamicÚ_some_attrgetter©ÚDistribution)ÚRemovedConfigErroré   )Úretrieve_fileÚurls_from_filezsetupcfg_examples.txtc                 K  s   t d| i|–ƒS )NZsrc_rootr   )ÚpathÚattrs© r   úo/var/www/html/bwave/python/venv/lib/python3.8/site-packages/setuptools/tests/config/test_apply_pyprojecttoml.pyÚmakedist!   s    r   ÚurlÚignorec                 C  s  |  tdtdd�¡ t| ƒ}t|dƒ}|jdd�}tƒ  |d¡}|j|dd� t	 
t|ƒ|¡}t 
t|ƒ|¡}t|ƒ}	t|ƒ}
|	|
ksŠt‚tdd	„ ||fD ƒƒr¸t|jƒt|jƒks¸t‚td
d	„ ||fD ƒƒ�rt|jƒ dd„ |j ¡ D ƒ}dd„ |j ¡ D ƒ}||k�st‚tdd	„ ||fD ƒƒ�r^dd„ |j ¡ D ƒ}dd„ |j ¡ D ƒ}||k�s^t‚tdd	„ ||fD ƒƒ�r¤dd„ |jD ƒ}dd„ |jD ƒ}||k�s¤t‚t|jƒt|jƒk�s¾t‚tdd	„ ||fD ƒƒ�rdd„ |j ¡ D ƒ}dd„ |j ¡ D ƒ}||k�st‚d S )NZ	read_attrz0.0.1)Zreturn_valueúpyproject.tomlúutf-8©Úencodingz	setup.cfgc                 s  s   | ]}t |d dƒV  qdS )Úlicense_filesN©Úgetattr©Ú.0Údr   r   r   Ú	<genexpr>7   s     z>test_apply_pyproject_equivalent_to_setupcfg.<locals>.<genexpr>c                 s  s   | ]}t |d dƒV  qdS )Úentry_pointsNr    r"   r   r   r   r%   :   s     c                 S  s(   h | ] \}}|ft d d„ |D ƒƒ˜’qS )c                 s  s   | ]}|  d d¡V  qdS ©ú Ú N©Úreplace©r#   Úir   r   r   r%   =   s     úHtest_apply_pyproject_equivalent_to_setupcfg.<locals>.<setcomp>.<genexpr>©Úsorted©r#   ÚkÚvr   r   r   Ú	<setcomp><   s   ÿz>test_apply_pyproject_equivalent_to_setupcfg.<locals>.<setcomp>c                 S  s(   h | ] \}}|ft d d„ |D ƒƒ˜’qS )c                 s  s   | ]}|  d d¡V  qdS r'   r*   r,   r   r   r   r%   A   s     r.   r/   r1   r   r   r   r4   @   s   ÿc                 s  s   | ]}t |d dƒV  qdS )Úpackage_dataNr    r"   r   r   r   r%   F   s     c                 S  s   h | ]\}}|ft |ƒ˜’qS r   r/   r1   r   r   r   r4   G   s     c                 S  s   h | ]\}}|ft |ƒ˜’qS r   r/   r1   r   r   r   r4   H   s     c                 s  s   | ]}t |d dƒV  qdS )Ú
data_filesNr    r"   r   r   r   r%   K   s     c                 S  s   h | ]\}}|ft |ƒ˜’qS r   r/   r1   r   r   r   r4   L   s     c                 S  s   h | ]\}}|ft |ƒ˜’qS r   r/   r1   r   r   r   r4   M   s     c                 s  s   | ]}t |d dƒV  qdS )Úextras_requireNr    r"   r   r   r   r%   Q   s     c                 S  s   h | ]\}}|ft |ƒ˜’qS r   r/   r1   r   r   r   r4   R   s     c                 S  s   h | ]\}}|ft |ƒ˜’qS r   r/   r1   r   r   r   r4   S   s     )Úsetattrr	   r   r   r   Ú	read_textr   Ú	translateÚ
write_textr
   Úapply_configurationr   r   Úcore_metadataÚAssertionErrorÚanyÚsetr   Úprintr&   Úitemsr5   r6   Úinstall_requiresr7   )r   ÚmonkeypatchÚtmp_pathZsetupcfg_exampleZpyproject_exampleZsetupcfg_textÚtoml_configZ	dist_tomlZdist_cfgZpkg_info_tomlZpkg_info_cfgZep_tomlZep_cfgZpkg_data_tomlZpkg_data_cfgZdata_files_tomlZdata_files_cfgZextra_req_tomlZextra_req_cfgr   r   r   Ú+test_apply_pyproject_equivalent_to_setupcfg%   sF    

þþrG   u‚  [project]
name = "spam"
version = "2020.0.0"
description = "Lovely Spam! Wonderful Spam!"
readme = "README.rst"
requires-python = ">=3.8"
license = {file = "LICENSE.txt"}
keywords = ["egg", "bacon", "sausage", "tomatoes", "Lobster Thermidor"]
authors = [
  {email = "hi@pradyunsg.me"},
  {name = "Tzu-Ping Chung"}
]
maintainers = [
  {name = "Brett Cannon", email = "brett@python.org"},
  {name = "John X. ÃƒÃ¸rÃ§eÄ�", email = "john@utf8.org"},
  {name = "Î“Î±Î¼Î± ï­‡ æ�±", email = "gama@utf8.org"},
]
classifiers = [
  "Development Status :: 4 - Beta",
  "Programming Language :: Python"
]

dependencies = [
  "httpx",
  "gidgethub[httpx]>4.0.0",
  "django>2.1; os_name != 'nt'",
  "django>2.0; os_name == 'nt'"
]

[project.optional-dependencies]
test = [
  "pytest < 5.0.0",
  "pytest-cov[all]"
]

[project.urls]
homepage = "http://example.com"
documentation = "http://readthedocs.org"
repository = "http://github.com"
changelog = "http://github.com/me/spam/blob/master/CHANGELOG.md"

[project.scripts]
spam-cli = "spam:main_cli"

[project.gui-scripts]
spam-gui = "spam:main_gui"

[project.entry-points."spam.magical"]
tomatoes = "spam:main_tomatoes"
uá   [project]
name = "spam"
version = "2020.0.0"
authors = [
  {email = "hi@pradyunsg.me"},
  {name = "Tzu-Ping Chung"}
]
maintainers = [
  {name = "Ð¡Ñ‚ÐµÐ¿Ð°Ð½ Ð‘Ð°Ð½Ð´ÐµÑ€Ð°", email = "ÐºÑ€Ð¸Ñ—Ð²ÐºÐ°@Ð¾ÑƒÐ½-ÑƒÐ¿Ð°.ÑƒÐºÑ€"},
]
zE
def main_cli(): pass
def main_gui(): pass
def main_tomatoes(): pass
z
README.rstc                 C  s‚   | d }|}dd|› d�i}|  ¡ D ]\}}| ||¡}q$|j|dd� | | jddd� | d jd	dd� | d
 jtdd� |S )Nr   zreadme = "README.rst"z
readme = "ú"r   r   zhello worldúLICENSE.txtú--- LICENSE stub ---zspam.py)rB   r+   r;   ÚPEP621_EXAMPLE_SCRIPT)rE   ÚreadmeÚpyproject_textÚ	pyprojectÚtextZreplacementsÚorigZsubstr   r   r   Ú_pep621_example_projectŸ   s    rQ   c                 C  sB   t | ƒ}t t| ƒ|¡}|jjdks(t‚t|jjƒdhks>t‚dS )z&Make sure the example in PEP 621 worksrJ   rI   N)	rQ   r
   r<   r   ÚmetadataÚlicenser>   r@   r   ©rE   rN   Údistr   r   r   Útest_pep621_example±   s    rV   zreadme, ctype)z
Readme.txtz
text/plain)z	readme.mdztext/markdown)ztext.rstz
text/x-rstc                 C  s.   t | |ƒ}t t| ƒ|¡}|jj|ks*t‚d S ©N©rQ   r
   r<   r   rR   Zlong_description_content_typer>   )rE   rL   ÚctyperN   rU   r   r   r   Útest_readme_content_type¹   s    	
rZ   c              	   C  s8   t | dƒ}tjtdd�� t t| ƒ|¡ W 5 Q R X d S )Nz
README.texz%Undefined content type for README.tex©Úmatch)rQ   ÚpytestÚraisesÚ
ValueErrorr
   r<   r   )rE   rN   r   r   r   Útest_undefined_content_typeÇ   s    
r`   c                 C  s.   t | dƒ}t t| ƒ|¡}|jjd ks*t‚d S )NÚREADMErX   rT   r   r   r   Ú3test_no_explicit_content_type_for_missing_extensionÍ   s    
rb   )rM   Úexpected_maintainers_meta_valueug   Brett Cannon <brett@python.org>, "John X. ÃƒÃ¸rÃ§eÄ�" <john@utf8.org>, Î“Î±Î¼Î± ï­‡ æ�± <gama@utf8.org>znon-international-emails)ÚiduA   Ð¡Ñ‚ÐµÐ¿Ð°Ð½ Ð‘Ð°Ð½Ð´ÐµÑ€Ð° <ÐºÑ€Ð¸Ñ—Ð²ÐºÐ°@Ð¾ÑƒÐ½-ÑƒÐ¿Ð°.ÑƒÐºÑ€>zlCPython's `email.headerregistry.Address` only supports RFC 5322, as of Nov 10, 2022 and latest Python 3.11.0T)ÚreasonÚstrictzinternational-email)Úmarksrd   c              	   C  s~   t |d|d�}t t|ƒ|¡}|jj| ks.t‚|d }t|ddd��}|j |¡ W 5 Q R X |j	dd�}d| › �|kszt‚d S )Nra   )rM   zPKG-FILEÚwr   r   zMaintainer-email: )
rQ   r
   r<   r   rR   Úmaintainer_emailr>   ÚopenÚwrite_pkg_filer9   )rc   rM   rE   rN   rU   Zpkg_fileÚfhÚcontentr   r   r   Ú test_utf8_maintainer_in_metadataÓ   s    ýrn   c                   @  s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestLicenseFilesc                 C  sP   t |dƒ}|jdd�}d|ks"t‚d|ks.t‚|› d|› d�}|j|dd� |S )Nra   r   r   z license = {file = "LICENSE.txt"}z[tool.setuptools]Ú
)rQ   r9   r>   r;   )ÚselfrE   Zadditional_textrN   rO   r   r   r   Úbase_pyproject  s    
zTestLicenseFiles.base_pyprojectc                 C  sz   d}|   ||¡}|d  ¡  |d  ¡  |d }|jddd� t t|ƒ|¡}t|jjƒddhksft	‚|jj
dksvt	‚d S )Nz,[tool.setuptools]
license-files = ["_FILE*"]z	_FILE.txtz	_FILE.rstrI   zLicenseRef-Proprietary
r   r   )rr   Útouchr;   r
   r<   r   r@   rR   r   r>   rS   )rq   rE   Úsetuptools_configrN   rS   rU   r   r   r   Ú+test_both_license_and_license_files_defined  s    z<TestLicenseFiles.test_both_license_and_license_files_definedc                 C  sx   d}|   ||¡}d ¡ }|D ]}|| j|› d�dd� qt t|ƒ|¡}|d  ¡ sZt‚t|j	j
ƒ|dh™kstt‚d S )Nz"[tool.setuptools]
zip-safe = falsez5LICENCE-a.html COPYING-abc.txt AUTHORS-xyz NOTICE,defrp   r   r   rI   )rr   Úsplitr;   r
   r<   r   Úexistsr>   r@   rR   r   )rq   rE   rt   rN   r   ÚfnamerU   r   r   r   Útest_default_patterns  s    z&TestLicenseFiles.test_default_patternsN)Ú__name__Ú
__module__Ú__qualname__rr   ru   ry   r   r   r   r   ro   ý   s   ro   c                   @  sJ   e Zd Zdd„ Zej dddg¡dd„ ƒZej ddd	d
g¡dd„ ƒZdS )ÚTestPyModulesc                 C  s6   d|›d�}t dƒ}|jt|ƒdd� t ti ƒ|¡S )Nzr
        [project]
        name = "test"
        version = "42.0"
        [tool.setuptools]
        py-modules = [z
]
        r   r   r   )r   r;   r   r
   r<   r   )rq   ÚnamerF   rN   r   r   r   rU   /  s    zTestPyModules.distÚmodulezpip-runu   abc-d.Î»-xyz-ec                 C  s"   |  |¡ ||  |¡jkst‚d S rW   )ÚchdirrU   Ú
py_modulesr>   ©rq   rE   rD   r   r   r   r   Útest_valid_module_name;  s    
z$TestPyModules.test_valid_module_namezpip runz-pip-runzpip-run-stubsc              	   C  s4   |  |¡ tjtdd�� |  |¡j W 5 Q R X d S )Nz
py-modulesr[   )r€   r]   r^   r_   rU   r�   r‚   r   r   r   Útest_invalid_module_name@  s    
z&TestPyModules.test_invalid_module_nameN)	rz   r{   r|   rU   r]   ÚmarkÚparametrizerƒ   r„   r   r   r   r   r}   ,  s
   
r}   c                   @  s   e Zd Zdd„ ZdS )ÚTestExtModulesc              	   C  s–   |  |¡ tdƒ}d}|jt|ƒdd� t tj¡� t t	i ƒ|¡}W 5 Q R X t
|jƒdksbt‚|jd jdksvt‚t|jd jƒdd	hks’t‚d S )
Nr   zÄ
        [project]
        name = "test"
        version = "42.0"
        [tool.setuptools]
        ext-modules = [
          {name = "my.ext", sources = ["hello.c", "world.c"]}
        ]
        r   r   r   r   zmy.extzhello.czworld.c)r€   r   r;   r   r]   Úwarnsr
   Z_ExperimentalConfigurationr<   r   ÚlenÚext_modulesr>   r~   r@   Úsources)rq   rE   rD   rN   rF   rU   r   r   r   Útest_pyproject_sets_attributeH  s    
	z,TestExtModules.test_pyproject_sets_attributeN)rz   r{   r|   rŒ   r   r   r   r   r‡   G  s   r‡   c                   @  s   e Zd Zdd„ ZdS )ÚTestDeprecatedFieldsc              	   C  sL   |d }d}|j t|ƒdd� tjtdd�� t t|ƒ|¡ W 5 Q R X d S )Nr   z�
        [project]
        name = "myproj"
        version = "42"
        [tool.setuptools]
        namespace-packages = ["myproj.pkg"]
        r   r   znamespace-packagesr[   )r;   r   r]   r^   r   r
   r<   r   )rq   rE   rN   Úconfigr   r   r   Útest_namespace_packages]  s
    z,TestDeprecatedFields.test_namespace_packagesN)rz   r{   r|   r�   r   r   r   r   r�   \  s   r�   c                   @  sâ   e Zd Zd$dd„Zej ddddgfddd	d
gifddddgifejdddgfdej d¡giŽg¡dd„ ƒZ	ej dddg fddi fdddgfdddgfg¡dd„ ƒZ
dd„ Zdd„ Zej dddg¡ej d ¡d!d"„ ƒƒZd#S )%ÚTestPresetFieldr)   c                 C  s:   d|›d�}d|kr|d7 }|d }|j || dd� |S )Nz"[project]
name = 'proj'
dynamic = rp   Úversionzversion = '42'
r   r   r   )r;   )rq   rE   ZdynamicZextra_contentrm   Úfiler   r   r   rN   l  s    zTestPresetField.pyprojectzattr, field, valueÚclassifierszPrivate :: Classifierr&   ÚscriptsÚconsole_scriptsúfoobar=foobar:mainúgui-scriptsÚgui_scriptszbazquux=bazquux:mainrC   ÚdependenciesÚsixrg   z&ignore:.*install_requires. overwrittenc           	   	   C  sv   |   |g ¡}t|f||iŽ}t d|› �tj¡}tjt|d�� t 	||¡}W 5 Q R X t
d|› �|ƒ|ƒ}|rrt‚dS )z:Setuptools cannot set a field if not listed in ``dynamic``z&defined outside of `pyproject.toml`:.*r[   ú	metadata.N)rN   r   ÚreÚcompileÚSr]   rˆ   r   r
   r<   r   r>   )	rq   rE   ÚattrÚfieldÚvaluerN   rU   ÚmsgÚ
dist_valuer   r   r   Útest_not_listed_in_dynamict  s    z*TestPresetField.test_not_listed_in_dynamicr7   zoptional-dependenciesc                 C  sN   |   ||g¡}t|f||iŽ}t ||¡}td|› �|ƒ|ƒ}||ksJt‚d S )Nr›   )rN   r   r
   r<   r   r>   )rq   rE   rŸ   r    r¡   rN   rU   r£   r   r   r   Útest_listed_in_dynamic�  s
    
z&TestPresetField.test_listed_in_dynamicc              	   C  s^   d}|d }|j |dd� t|dgd�}tjdd�� t ||¡}W 5 Q R X d|jksZt‚d S )	Nz:[project]
name='pkg'
version='0.1'
dependencies=['click']
r   r   r   Úwheel©rC   z`install_requires` overwrittenr[   )r;   r   r]   rˆ   r
   r<   rC   r>   )rq   rE   ÚsrcrN   rU   r   r   r   Ú%test_warning_overwritten_dependencies�  s    z5TestPresetField.test_warning_overwritten_dependenciesc                 C  s’   d}|   |dg|¡}dg}t||d�}t ||¡}d|jks@t‚| d¡}t|||d ƒ |d jdd	�}d
|ksvt‚d|ks‚t‚d|ksŽt‚dS )a#  
        Internally setuptools converts dependencies with markers to "extras".
        If ``install_requires`` is given by ``setup.py``, we have to ensure that
        applying ``optional-dependencies`` does not overwrite the mandatory
        dependencies with markers (see #3204).
        z1
[project.optional-dependencies]
foo = ['bar>1']
r™   z6importlib-resources (>=3.0.0) ; python_version < "3.7"r§   ZfooÚegg_infozrequires.txtr   r   zimportlib-resourcesÚbarz:python_version < "3.7"N)	rN   r   r
   r<   r7   r>   Úget_command_objr   r9   )rq   rE   ÚextrarN   Úinstall_reqrU   rª   Úreqsr   r   r   Ú2test_optional_dependencies_dont_remove_env_markers¦  s    	
zBTestPresetField.test_optional_dependencies_dont_remove_env_markerszfield,group)r”   r•   )r—   r˜   Úerrorc                 C  s>   |   ||g¡}t||dgid�}t ||¡}||jks:t‚d S )Nr–   )r&   )rN   r   r
   r<   r&   r>   )rq   rE   r    ÚgrouprN   rU   r   r   r   Ú.test_scripts_dont_require_dynamic_entry_points¼  s    z>TestPresetField.test_scripts_dont_require_dynamic_entry_pointsN)r)   )rz   r{   r|   rN   r]   r…   r†   ÚparamÚfilterwarningsr¤   r¥   r©   r°   r³   r   r   r   r   r�   k  s@   


ÿ
ÿþüþ


üþ	
	 ÿ
r�   c                   @  s   e Zd Zdd„ ZdS )ÚTestMetac              	   C  s4   t  |¡� }tdd„ | ¡ D ƒƒs&t‚W 5 Q R X dS )z,Meta test to ensure tests can run from sdistc                 s  s   | ]}|  t¡V  qd S rW   )ÚendswithÚEXAMPLES_FILE)r#   r~   r   r   r   r%   Ì  s     z6TestMeta.test_example_file_in_sdist.<locals>.<genexpr>N)Útarfilerj   r?   Úgetnamesr>   )rq   Zsetuptools_sdistÚtarr   r   r   Útest_example_file_in_sdistÉ  s    z#TestMeta.test_example_file_in_sdistN)rz   r{   r|   r¼   r   r   r   r   r¶   È  s   r¶   c                   @  s   e Zd Zdd„ ZdS )ÚTestInteropCommandLineParsingc           	      C  sf   |  |¡ d}t|dƒ}|jt|ƒdd� ddgi}t t|ƒ|¡}| ¡  | ¡ }d|j	ksbt
‚d S )NzJ
        [project]
        name = "test"
        version = "42.0"
        r   r   r   Úscript_argsz	--versionz42.0)r€   r   r;   r   r
   r<   r   Úparse_command_lineZ
readouterrÚoutr>   )	rq   rE   rD   ZcapsysrF   rN   ÚoptsrU   Zcapturedr   r   r   Útest_versionÐ  s    


z*TestInteropCommandLineParsing.test_versionN)rz   r{   r|   rÂ   r   r   r   r   r½   Ï  s   r½   Ústr)Úreturnc              	   C  s    t  ¡ �}| j |¡ | ¡ }W 5 Q R X tj|dd� d}tƒ }|d7 }|d7 }|d7 }| d¡ g }| 	¡ D ]&}| 
|¡sn||kr†qn| |d ¡ qnd |¡S )	NT)Úvalidater   )zAuthor:zAuthor-email:zMaintainer:zMaintainer-email:)zProject-URL: Homepage,z
Home-page:)zDescription-Content-Type:r)   rp   )ÚioÚStringIOrR   rk   Úgetvaluer   Z
from_emailr@   ÚaddÚ
splitlinesÚ
startswithÚappendÚjoin)rU   ÚbufferZpkg_file_txtZskip_prefixesZ
skip_linesÚresultÚliner   r   r   r=   å  s     

r=   )?Ú__doc__Ú
__future__r   rÆ   rœ   r¹   Úinspectr   Úpathlibr   Zunittest.mockr   r]   Zini2toml.apir   Zpackaging.metadatar   Ú
setuptoolsZsetuptools.command.egg_infor   Zsetuptools.configr	   r
   r   Z&setuptools.config._apply_pyprojecttomlr   r   Zsetuptools.distr   Zsetuptools.errorsr   Z	downloadsr   r   Ú__file__ÚparentZHEREr¸   r   r…   r†   rµ   Zuses_networkrG   ZPEP621_EXAMPLEZ"PEP621_INTERNATIONAL_EMAIL_EXAMPLErK   rQ   rV   rZ   r`   rb   r´   Zxfailrn   ro   r}   r‡   r�   r�   r¶   r½   r=   r   r   r   r   Ú<module>   sˆ   

/4	ý
ýþ
úýø÷þ
/]