o
    5‘ði©s  ã                   @  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 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 m!Z! ddl"m#Z#m$Z$ ddl%m&Z&m'Z' e	e(ƒj)Z*dZ+dd„ Z,dd„ Z-ej. /de'e*e+ ƒ¡ej. 0d¡ej.j1dd„ ƒƒƒZ2dZ3dZ4dZ5dZ6dZ7d e3fd!d"„Z8d#d$„ Z9ej. /d%g d&¢¡d'd(„ ƒZ:d)d*„ Z;d+d,„ Z<ej. /d-ej=e3d.d/d0�ej=e4d1ej.j>d2d3d4�d5d6�f¡d7d8„ ƒZ?ej. /d9ej=e6d:dd;d<d=ej. 0d>¡gd?�ej=e7dd@dAdBdCd0�f¡dDdE„ ƒZ@dFdG„ ZAdHdI„ ZBG dJdK„ dKƒZCG dLdM„ dMƒZDG dNdO„ dOƒZEG dPdQ„ dQƒZFG dRdS„ dSƒZGG dTdU„ dUƒZHG dVdW„ dWƒZIG dXdY„ dYƒZJd^d\d]„ZKdS )_zÍ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)Ú	is_static)Úwrite_requirements)ÚexpandÚpyprojecttomlÚsetupcfg)Ú_MissingDynamicÚ_some_attrgetter©ÚDistribution)ÚInvalidConfigErrorÚRemovedConfigError)ÚInformationOnlyÚSetuptoolsDeprecationWarningé   )Úretrieve_fileÚurls_from_filezsetupcfg_examples.txtc                 K  s   t d| i|¥ƒS )NÚsrc_rootr   )ÚpathÚattrs© r   úo/root/parts/websockify/install/lib/python3.10/site-packages/setuptools/tests/config/test_apply_pyprojecttoml.pyÚmakedist#   s   r   c                 O  s   dd„ | D ƒS )z„
    Allow comparing the given patterns for 2 dist objects.
    We need to strip special chars to avoid errors when validating.
    c                 S  s$   g | ]}t jd d|t jd�pd‘qS )z
[^a-z0-9]+Ú )ÚflagsÚempty)ÚreÚsubÚ
IGNORECASE)Ú.0Úpr   r   r   Ú
<listcomp>,   s    ÿz)_mock_expand_patterns.<locals>.<listcomp>r   )ÚpatternsÚ_Ú__r   r   r   Ú_mock_expand_patterns'   s   ÿr*   ÚurlÚignorec                 C  s  |  tdtdd�¡ |  tdttd�¡ t| ƒ}t|dƒ}|jdd�}tƒ  	|d	¡}|j
|dd� t t|ƒ|¡}t t|ƒ|¡}t|ƒ}	t|ƒ}
|	|
ksOJ ‚td
d„ ||fD ƒƒrft|jƒt|jƒksfJ ‚tdd„ ||fD ƒƒr�t|jƒ dd„ |j ¡ D ƒ}dd„ |j ¡ D ƒ}||ks�J ‚tdd„ ||fD ƒƒrµdd„ |j ¡ D ƒ}dd„ |j ¡ D ƒ}||ksµJ ‚tdd„ ||fD ƒƒrÖdd„ |jD ƒ}dd„ |jD ƒ}||ksÖJ ‚t|jƒt|jƒksâJ ‚tdd„ ||fD ƒƒ�r	dd„ |j ¡ D ƒ}dd„ |j ¡ D ƒ}||k�sJ ‚d S d S )NÚ	read_attrz0.0.1)Úreturn_valueÚ_expand_patterns)Úside_effectúpyproject.tomlúutf-8©Úencodingz	setup.cfgc                 s  ó   � | ]	}t |d dƒV  qdS )Úlicense_filesN©Úgetattr©r$   Údr   r   r   Ú	<genexpr>F   ó   € z>test_apply_pyproject_equivalent_to_setupcfg.<locals>.<genexpr>c                 s  r5   )Úentry_pointsNr7   r9   r   r   r   r;   I   r<   c                 S  ó*   h | ]\}}|gt d d„ |D ƒƒ¢R ’qS )c                 s  ó   � | ]	}|  d d¡V  qdS ©ú r   N©Úreplace©r$   Úir   r   r   r;   L   r<   úHtest_apply_pyproject_equivalent_to_setupcfg.<locals>.<setcomp>.<genexpr>©Úsorted©r$   ÚkÚvr   r   r   Ú	<setcomp>K   ó    ÿÿz>test_apply_pyproject_equivalent_to_setupcfg.<locals>.<setcomp>c                 S  r>   )c                 s  r?   r@   rB   rD   r   r   r   r;   P   r<   rF   rG   rI   r   r   r   rL   O   rM   c                 s  r5   )Úpackage_dataNr7   r9   r   r   r   r;   U   r<   c                 S  ó    h | ]\}}|gt |ƒ¢R ’qS r   rG   rI   r   r   r   rL   V   ó     c                 S  rO   r   rG   rI   r   r   r   rL   W   rP   c                 s  r5   )Ú
data_filesNr7   r9   r   r   r   r;   Z   r<   c                 S  rO   r   rG   rI   r   r   r   rL   [   rP   c                 S  rO   r   rG   rI   r   r   r   rL   \   rP   c                 s  r5   )Úextras_requireNr7   r9   r   r   r   r;   `   r<   c                 S  rO   r   rG   rI   r   r   r   rL   a   rP   c                 S  rO   r   rG   rI   r   r   r   rL   b   rP   )Úsetattrr
   r   r   r*   r   r   Ú	read_textr   Ú	translateÚ
write_textr   Úapply_configurationr   r   Úcore_metadataÚanyÚsetr6   Úprintr=   ÚitemsrN   rQ   Úinstall_requiresrR   )r+   ÚmonkeypatchÚtmp_pathÚsetupcfg_exampleÚpyproject_exampleÚsetupcfg_textÚtoml_configÚ	dist_tomlÚdist_cfgÚpkg_info_tomlÚpkg_info_cfgÚep_tomlÚep_cfgÚpkg_data_tomlÚpkg_data_cfgÚdata_files_tomlÚdata_files_cfgÚextra_req_tomlÚextra_req_cfgr   r   r   Ú+test_apply_pyproject_equivalent_to_setupcfg1   sP   ÿ

þþýrp   u¤  [project]
name = "spam"
version = "2020.0.0"
description = "Lovely Spam! Wonderful Spam!"
readme = "README.rst"
requires-python = ">=3.8"
license-files = ["LICENSE.txt"]  # Updated to be PEP 639 compliant
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 = "ankit@example.com"},
]
zE
def main_cli(): pass
def main_gui(): pass
def main_tomatoes(): pass
z�[project]
name = "spam"
version = "2020.0.0"
authors = [
  {email = "hi@pradyunsg.me"},
  {name = "Tzu-Ping Chung"}
]
license = {text = "MIT"}
a#  [project]
name = "spam"
version = "2020.0.0"
authors = [
  {email = "hi@pradyunsg.me"},
  {name = "Tzu-Ping Chung"}
]
license = "mit or apache-2.0"  # should be normalized in metadata
classifiers = [
    "Development Status :: 5 - Production/Stable",
    "Programming Language :: Python",
]
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 )Nr1   zreadme = "README.rst"z
readme = "ú"r2   r3   zhello worldúLICENSE.txtú--- LICENSE stub ---zspam.py)r\   rC   rV   ÚPEP621_EXAMPLE_SCRIPT)r_   ÚreadmeÚpyproject_textÚ	pyprojectÚtextÚreplacementsÚorigÚsubstr   r   r   Ú_pep621_example_projectÈ   s   r|   c                 C  s2   t | ƒ}t t| ƒ|¡}t|jjƒdhksJ ‚dS )z&Make sure the example in PEP 621 worksrr   N)r|   r   rW   r   rZ   Úmetadatar6   ©r_   rw   Údistr   r   r   Útest_pep621_exampleÚ   s   r€   )ru   Ú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J ‚d S ©N©r|   r   rW   r   r}   Úlong_description_content_type)r_   ru   r�   rw   r   r   r   r   Útest_readme_content_typeá   s   
	r…   c                 C  sN   t | dƒ}tjtdd�� t t| ƒ|¡ W d   ƒ d S 1 s w   Y  d S )Nz
README.texz%Undefined content type for README.tex©Úmatch)r|   ÚpytestÚraisesÚ
ValueErrorr   rW   r   )r_   rw   r   r   r   Útest_undefined_content_typeï   s   
"ÿr‹   c                 C  s.   t | dƒ}t t| ƒ|¡}|jjd u sJ ‚d S )NÚREADMErƒ   r~   r   r   r   Ú3test_no_explicit_content_type_for_missing_extensionõ   s   
r�   )rv   Úexpected_maintainers_meta_valueug   Brett Cannon <brett@python.org>, "John X. ÃƒÃ¸rÃ§eÄ�" <john@utf8.org>, Î“Î±Î¼Î± ï­‡ æ�± <gama@utf8.org>znon-international-emails)Úidu?   Ankit Ahlawat <à¤…à¤‚à¤•à¤¿à¤¤@à¤‰à¤¦à¤¾à¤¹à¤°à¤£.à¤­à¤¾à¤°à¤¤>zlCPython's `email.headerregistry.Address` only supports RFC 5322, as of Oct 20, 2025 and latest Python 3.13.0T)ÚreasonÚstrictzinternational-email)Úmarksr�   c                 C  s’   t |d|d�}t t|ƒ|¡}|jj| ksJ ‚|d }t|ddd��}|j |¡ W d   ƒ n1 s3w   Y  |jdd�}d| › �|v sGJ ‚d S )NrŒ   ©rv   úPKG-FILEÚwr2   r3   zMaintainer-email: )	r|   r   rW   r   r}   Úmaintainer_emailÚopenÚwrite_pkg_filerT   )rŽ   rv   r_   rw   r   Úpkg_fileÚfhÚcontentr   r   r   Ú test_utf8_maintainer_in_metadataû   s   ýÿrœ   )rv   ÚlicenseÚlicense_expressionÚcontent_strÚnot_content_strÚMITzLicense: MITzLicense-Expression: zlicense-textz6ignore:.project.license. as a TOML table is deprecated)r�   r’   zMIT OR Apache-2.0z%License-Expression: MIT OR Apache-2.0z	License: zlicense-expressionc                 C  s´   t |d|d�}t t|ƒ|¡}|jj| ksJ ‚|jj|ksJ ‚|d }t|ddd��}	|j |	¡ W d   ƒ n1 s;w   Y  |j	dd�}
d|
v sLJ ‚||
v sRJ ‚||
vsXJ ‚d S )NrŒ   r“   r”   r•   r2   r3   zMetadata-Version: 2.4)
r|   r   rW   r   r}   r�   rž   r—   r˜   rT   )r�   rž   rŸ   r    rv   r_   rw   r   r™   rš   r›   r   r   r   Útest_license_in_metadata%  s    (ýÿr¢   c                 C  sz   t  dd¡d }t| d|› d�ƒ}d}tjt|d��}t t| ƒ|¡ W d   ƒ n1 s-w   Y  dt	|j
ƒv s;J ‚d S )	NÚ
é   r   rŒ   z/
    "License :: OSI Approved :: MIT License"
]z?License classifiers have been superseded by license expressionsr†   ú&License :: OSI Approved :: MIT License)ÚPEP639_LICENSE_EXPRESSIONÚrsplitr|   rˆ   r‰   r   r   rW   r   ÚstrÚvalue)r_   rx   rw   ÚmsgÚexcr   r   r   Ú/test_license_classifier_with_license_expression^  s   ýÿr¬   c              	   C  sœ   d}t | d|ƒ}d}d}tjt|d��' tjt|d�� t t| ƒ|¡}W d   ƒ n1 s.w   Y  W d   ƒ n1 s=w   Y  |j ¡ dgksLJ ‚d S )Nz¥    [project]
    name = "spam"
    version = "2020.0.0"
    license = {text = "mit or apache-2.0"}
    classifiers = ["License :: OSI Approved :: MIT License"]
    rŒ   z5License classifiers are deprecated(?:.|
)*MIT Licenseú/.project.license. as a TOML table is deprecatedr†   r¥   )	r|   rˆ   Úwarnsr   r   rW   r   r}   Úget_classifiers)r_   rx   rw   Úmsg1Úmsg2r   r   r   r   Ú2test_license_classifier_without_license_expressionl  s   ÿþü€ r²   c                   @  sT   e Zd Z		ddd„Zddd„Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚTestLicenseFilesr   ú!license = {file = "LICENSE.txt"}
c                 C  sh   t }d|v sJ ‚d|vsJ ‚d|vsJ ‚tjd||dd�}||v s#J ‚|› d|› d�}t|d|d	�}|S )
Nzlicense = "mit or apache-2.0"zlicense-filesz[tool.setuptools]z(license = .*)\nr   )Úcountr£   rŒ   r“   )r¦   r!   r"   r|   )Úselfr_   Úadditional_textÚlicense_tomlrx   rw   r   r   r   Úbase_pyprojectƒ  s   üzTestLicenseFiles.base_pyprojectc                 C  s   | j ||dd�S )Nz>license = "licenseref-Proprietary"
license-files = ["_FILE*"]
)r·   r¸   )r¹   )r¶   r_   r·   r   r   r   Úbase_pyproject_license_pep639›  s
   ýz.TestLicenseFiles.base_pyproject_license_pep639c              	   C  sÞ   d}|   ||¡}|d  ¡  |d  ¡  |d }|jddd� d}d	}tjt|d
��' tjt|d
�� t t|ƒ|¡}W d   ƒ n1 sEw   Y  W d   ƒ n1 sTw   Y  t	|j
jƒddhkseJ ‚|j
jdksmJ ‚d S )Nú,[tool.setuptools]
license-files = ["_FILE*"]ú	_FILE.txtú	_FILE.rstrr   zLicenseRef-Proprietary
r2   r3   zQ'tool.setuptools.license-files' is deprecated in favor of 'project.license-files'r­   r†   )r¹   ÚtouchrV   rˆ   r®   r   r   rW   r   rZ   r}   r6   r�   )r¶   r_   Úsetuptools_configrw   r�   r°   r±   r   r   r   r   Ú+test_both_license_and_license_files_defined£  s$   ÿþü€ z<TestLicenseFiles.test_both_license_and_license_files_definedc                 C  s    |   |¡}|d  ¡  |d  ¡  d}tjt|d�� t t|ƒ|¡}W d   ƒ n1 s-w   Y  t|j	j
ƒddhks>J ‚|j	jd u sFJ ‚|j	jdksNJ ‚d S )Nr¼   r½   zNormalizing.*LicenseRefr†   zLicenseRef-Proprietary)rº   r¾   rˆ   r®   r   r   rW   r   rZ   r}   r6   r�   rž   )r¶   r_   rw   rª   r   r   r   r   Ú2test_both_license_and_license_files_defined_pep639¹  s   
ÿzCTestLicenseFiles.test_both_license_and_license_files_defined_pep639c                 C  sX   d}|   ||¡}d}tjt|d�� t t|ƒ|¡ W d   ƒ d S 1 s%w   Y  d S )Nr»   zR'project.license-files' is defined already. Remove 'tool.setuptools.license-files'r†   )rº   rˆ   r‰   r   r   rW   r   )r¶   r_   r¿   rw   rª   r   r   r   Ú test_license_files_defined_twiceÈ  s   "ÿz1TestLicenseFiles.test_license_files_defined_twicec                 C  s~   d}| j ||dd�}d ¡ }|D ]}|| j|› d�dd� qt t|ƒ|¡}|d  ¡ s/J ‚t|jj	ƒh |£d’ks=J ‚d S )	Nz"[tool.setuptools]
zip-safe = falser   )r¸   z5LICENCE-a.html COPYING-abc.txt AUTHORS-xyz NOTICE,defr£   r2   r3   rr   )
r¹   ÚsplitrV   r   rW   r   ÚexistsrZ   r}   r6   )r¶   r_   r¿   rw   r6   Úfnamer   r   r   r   Útest_default_patternsÑ  s    z&TestLicenseFiles.test_default_patternsc              	   C  sª   |   |¡}t| d¡ƒg ksJ ‚d}d}tjt|d��0 tjt|d�� t t	|ƒ|¡ W d   ƒ n1 s6w   Y  W d   ƒ d S W d   ƒ d S 1 sNw   Y  d S )Nz_FILE*z-Cannot find any files for the given pattern.*z@Normalizing 'licenseref-Proprietary' to 'LicenseRef-Proprietary'r†   )
rº   ÚlistÚglobrˆ   r®   r   r   r   rW   r   )r¶   r_   rw   r°   r±   r   r   r   Útest_missing_patternsà  s   
ÿþPüz&TestLicenseFiles.test_missing_patternsc                 C  s�   dt v sJ ‚t  dd¡}t||d�}d}tjt|d�� t t|ƒ|¡}W d  ƒ n1 s.w   Y  |j	j
dks;J ‚t|j	jƒdhksFJ ‚dS )	z?Make sure the old example with ``license = {text = ...}`` workszlicense-files = ["LICENSE.txt"]z license = {file = "LICENSE.txt"}r“   r­   r†   Nrs   rr   )ÚPEP621_EXAMPLErC   r|   rˆ   r®   r   r   rW   r   r}   r�   rZ   r6   )r¶   r_   rx   rw   rª   r   r   r   r   Ú$test_deprecated_file_expands_to_textì  s   þÿz5TestLicenseFiles.test_deprecated_file_expands_to_textN)r   r´   ©r   )Ú__name__Ú
__module__Ú__qualname__r¹   rº   rÀ   rÁ   rÂ   rÆ   rÉ   rË   r   r   r   r   r³   ‚  s    
ü
	r³   c                   @  sH   e Zd Zdd„ Zej dddg¡dd„ ƒZej dg d¢¡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
]
        r1   r2   r3   )r   rV   r   r   rW   r   )r¶   Únamerc   rw   r   r   r   r     s   ûzTestPyModules.distÚmodulezpip-runu   abc-d.Î»-xyz-ec                 C  s"   |  |¡ ||  |¡jv sJ ‚d S r‚   )Úchdirr   Ú
py_modules©r¶   r_   r^   rÒ   r   r   r   Útest_valid_module_name  s   
z$TestPyModules.test_valid_module_name)zpip runz-pip-runzpip-run-stubsc                 C  sJ   |  |¡ tjtdd�� |  |¡j W d   ƒ d S 1 sw   Y  d S )Nz
py-modulesr†   )rÓ   rˆ   r‰   rŠ   r   rÔ   rÕ   r   r   r   Útest_invalid_module_name  s   
"ÿz&TestPyModules.test_invalid_module_nameN)	rÍ   rÎ   rÏ   r   rˆ   ÚmarkÚparametrizerÖ   r×   r   r   r   r   rÐ   þ  s    
rÐ   c                   @  s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestExtModulesc                 C  sZ   t dƒ}|jt|ƒdd� t tj¡� t ti ƒ|¡W  d   ƒ S 1 s&w   Y  d S )Nr1   r2   r3   )	r   rV   r   rˆ   r®   r   Ú_ExperimentalConfigurationrW   r   )r¶   rc   rw   r   r   r   Ú	make_dist  s
   $ÿzTestExtModules.make_distc                 C  s^   |  |¡ d}|  |¡}t|jƒdksJ ‚|jd jdksJ ‚t|jd jƒddhks-J ‚d S )NzÄ
        [project]
        name = "test"
        version = "42.0"
        [tool.setuptools]
        ext-modules = [
          {name = "my.ext", sources = ["hello.c", "world.c"]}
        ]
        r   r   zmy.extzhello.czworld.c)rÓ   rÜ   ÚlenÚext_modulesrÑ   rZ   Úsources©r¶   r_   r^   rc   r   r   r   r   Útest_pyproject_sets_attribute   s   

	 z,TestExtModules.test_pyproject_sets_attributec                 C  sf   |  |¡ d}|  |¡}t|jd jd tƒsJ ‚|jd jd dks%J ‚|jd jd dks1J ‚d S )Nzó
        [project]
        name = "test"
        version = "42.0"
        [[tool.setuptools.ext-modules]]
        name = "my.ext"
        sources = ["hello.c", "world.c"]
        define-macros = [["FIRST_SINGLE"], ["SECOND_TWO", "1"]]
        r   )ÚFIRST_SINGLEr   )Ú
SECOND_TWOÚ1)rÓ   rÜ   Ú
isinstancerÞ   Údefine_macrosÚtuplerà   r   r   r   Ú&test_pyproject_define_macros_as_tuples0  s   

	z5TestExtModules.test_pyproject_define_macros_as_tuplesN)rÍ   rÎ   rÏ   rÜ   rá   rè   r   r   r   r   rÚ     s    rÚ   c                   @  ó   e Zd Zdd„ ZdS )ÚTestDeprecatedFieldsc                 C  sb   |d }d}|j t|ƒdd� tjtdd�� t t|ƒ|¡ W d   ƒ d S 1 s*w   Y  d S )Nr1   z�
        [project]
        name = "myproj"
        version = "42"
        [tool.setuptools]
        namespace-packages = ["myproj.pkg"]
        r2   r3   znamespace-packagesr†   )rV   r   rˆ   r‰   r   r   rW   r   )r¶   r_   rw   Úconfigr   r   r   Útest_namespace_packagesC  s   "ÿz,TestDeprecatedFields.test_namespace_packagesN)rÍ   rÎ   rÏ   rì   r   r   r   r   rê   B  ó    rê   c                   @  s  e Zd Zd)dd„Zej ddejddej d¡giŽ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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d d!„ Zej d"d#d$g¡ej d%¡d&d'„ ƒƒZd(S )*ÚTestPresetFieldr   c                 C  s:   d|›d�}d|vr|d7 }|d }|j || dd� |S )Nz"[project]
name = 'proj'
dynamic = r£   Úversionzversion = '42'
r1   r2   r3   )rV   )r¶   r_   ÚdynamicÚextra_contentr›   Úfiler   r   r   rw   R  s   zTestPresetField.pyproject)ÚattrÚfieldr©   )rž   r�   r¡   )r�   r�   zNot SPDXr’   zignore:.*license. overwrittenÚclassifierszPrivate :: Classifierr=   ÚscriptsÚconsole_scriptsúfoobar=foobar:mainúgui-scriptsÚgui_scriptszbazquux=bazquux:mainr]   ÚdependenciesÚsixz&ignore:.*install_requires. overwrittenc           	      C  sŽ   |   |g ¡}t|fi ||i¤Ž}t d|› �tj¡}tjt|d�� t 	||¡}W d  ƒ n1 s2w   Y  t
d|› �|ƒ|ƒ}|rEJ ‚dS )z:Setuptools cannot set a field if not listed in ``dynamic``z&defined outside of `pyproject.toml`:.*r†   Nú	metadata.)rw   r   r!   ÚcompileÚDOTALLrˆ   r®   r   r   rW   r   )	r¶   r_   ró   rô   r©   rw   r   rª   Ú
dist_valuer   r   r   Útest_not_listed_in_dynamicZ  s   ÿz*TestPresetField.test_not_listed_in_dynamicrR   zoptional-dependenciesc                 C  sR   |   ||g¡}t|fi ||i¤Ž}t ||¡}td|› �|ƒ|ƒ}||ks'J ‚d S )Nrý   )rw   r   r   rW   r   )r¶   r_   ró   rô   r©   rw   r   r   r   r   r   Útest_listed_in_dynamicx  s
   z&TestPresetField.test_listed_in_dynamicc                 C  sX   |  |¡ |  |g ¡}t|dgd�}|d jddd� t ||¡}|jjdgks*J ‚dS )ap  
        license-file is currently not considered in the context of dynamic.
        As per 2025-02-19, https://packaging.python.org/en/latest/specifications/pyproject-toml/#license-files
        allows setuptools to fill-in `license-files` the way it sees fit:

        > If the license-files key is not defined, tools can decide how to handle license files.
        > For example they can choose not to include any files or use their own
        > logic to discover the appropriate files in the distribution.

        Using license_files from setup.py to fill-in the value is in accordance
        with this rule.
        zLIC*)r6   ÚLIC1Ú42r2   r3   N)rÓ   rw   r   rV   r   rW   r}   r6   )r¶   r^   r_   rw   r   r   r   r   Ú&test_license_files_exempt_from_dynamic‰  s   
z6TestPresetField.test_license_files_exempt_from_dynamicc                 C  sr   d}|d }|j |dd� t|dgd�}tjdd�� t ||¡}W d   ƒ n1 s+w   Y  d|jvs7J ‚d S )	Nz:[project]
name='pkg'
version='0.1'
dependencies=['click']
r1   r2   r3   Úwheel©r]   z`install_requires` overwrittenr†   )rV   r   rˆ   r®   r   rW   r]   )r¶   r_   Úsrcrw   r   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v s J ‚| d¡}t|||d ƒ |d jdd	�}d
|v s;J ‚d|v sAJ ‚d|v sGJ ‚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  ÚfooÚegg_infozrequires.txtr2   r3   zimportlib-resourcesÚbarz:python_version < "3.7"N)rw   r   r   rW   rR   Úget_command_objr	   rT   )r¶   r_   Úextrarw   Úinstall_reqr   r  Úreqsr   r   r   Ú2test_optional_dependencies_dont_remove_env_markers¦  s   	
zBTestPresetField.test_optional_dependencies_dont_remove_env_markers)rô   Úgroup)rö   r÷   )rù   rú   Úerrorc                 C  s>   |   ||g¡}t||dgid�}t ||¡}||jv sJ ‚d S )Nrø   )r=   )rw   r   r   rW   r=   )r¶   r_   rô   r  rw   r   r   r   r   Ú.test_scripts_dont_require_dynamic_entry_points¼  s   z>TestPresetField.test_scripts_dont_require_dynamic_entry_pointsNrÌ   )rÍ   rÎ   rÏ   rw   rˆ   rØ   rÙ   ÚparamÚfilterwarningsr  r  r  r	  r  r  r   r   r   r   rî   Q  sR    
ÿþ

ÿ
ÿþ÷þ


ûþ

	þ
rî   c                   @  ré   )ÚTestMetac                 C  sJ   t  |¡�}tdd„ | ¡ D ƒƒsJ ‚W d  ƒ dS 1 sw   Y  dS )z,Meta test to ensure tests can run from sdistc                 s  s   � | ]}|  t¡V  qd S r‚   )ÚendswithÚEXAMPLES_FILE)r$   rÑ   r   r   r   r;   Í  s   € z6TestMeta.test_example_file_in_sdist.<locals>.<genexpr>N)Útarfiler—   rY   Úgetnames)r¶   Úsetuptools_sdistÚtarr   r   r   Útest_example_file_in_sdistÊ  s   "ÿz#TestMeta.test_example_file_in_sdistN)rÍ   rÎ   rÏ   r  r   r   r   r   r  É  rí   r  c                   @  ré   )ÚTestInteropCommandLineParsingc           	      C  sf   |  |¡ d}t|dƒ}|jt|ƒdd� ddgi}t t|ƒ|¡}| ¡  | ¡ }d|j	v s1J ‚d S )NzJ
        [project]
        name = "test"
        version = "42.0"
        r1   r2   r3   Úscript_argsz	--versionz42.0)
rÓ   r   rV   r   r   rW   r   Úparse_command_lineÚ
readouterrÚout)	r¶   r_   r^   Úcapsysrc   rw   Úoptsr   Úcapturedr   r   r   Útest_versionÑ  s   


z*TestInteropCommandLineParsing.test_versionN)rÍ   rÎ   rÏ   r'  r   r   r   r   r  Ð  rí   r  c                   @  ré   )ÚTestStaticConfigc                 C  sœ   |  |¡ d}t|dƒ}|jt|ƒdd� t ti ƒ|¡}t|jƒs$J ‚t|j	j
ƒs,J ‚t|j	jƒs4J ‚t|j	jƒs<J ‚t|j	jƒsDJ ‚t|j	jƒsLJ ‚d S )Na)  
        [project]
        name = "test"
        version = "42.0"
        dependencies = ["hello"]
        keywords = ["world"]
        classifiers = ["private :: hello world"]
        [tool.setuptools]
        obsoletes = ["abcd"]
        provides = ["abcd"]
        platforms = ["abcd"]
        r1   r2   r3   )rÓ   r   rV   r   r   rW   r   r   r]   r}   Úkeywordsrõ   Ú	obsoletesÚprovidesÚ	platforms)r¶   r_   r^   rc   rw   r   r   r   r   Útest_mark_static_fieldsä  s   

z(TestStaticConfig.test_mark_static_fieldsN)rÍ   rÎ   rÏ   r-  r   r   r   r   r(  ã  rí   r(  Úreturnr¨   c                 C  s´   t  ¡ �}| j |¡ | ¡ }W d   ƒ n1 sw   Y  tj|dd� d}tƒ }|d7 }|d7 }|d7 }| d¡ g }| 	¡ D ]}| 
|¡sL||v rMqA| |d ¡ qAd |¡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   r£   )ÚioÚStringIOr}   r˜   Úgetvaluer   Ú
from_emailrZ   ÚaddÚ
splitlinesÚ
startswithÚappendÚjoin)r   ÚbufferÚpkg_file_txtÚskip_prefixesÚ
skip_linesÚresultÚliner   r   r   rX      s"   

þ

rX   )r.  r¨   )LÚ__doc__Ú
__future__r   r0  r!   r  Úinspectr   Úpathlibr   Úunittest.mockr   rˆ   Úini2toml.apir   Úpackaging.metadatar   Ú
setuptoolsÚsetuptools._staticr   Úsetuptools.command.egg_infor	   Úsetuptools.configr
   r   r   Ú&setuptools.config._apply_pyprojecttomlr   r   Úsetuptools.distr   Úsetuptools.errorsr   r   Úsetuptools.warningsr   r   Ú	downloadsr   r   Ú__file__ÚparentÚHEREr  r   r*   rØ   rÙ   r  Úuses_networkrp   rÊ   Ú"PEP621_INTERNATIONAL_EMAIL_EXAMPLErt   ÚPEP639_LICENSE_TEXTr¦   r|   r€   r…   r‹   r�   r  Úxfailrœ   r¢   r¬   r²   r³   rÐ   rÚ   rê   rî   r  r  r(  rX   r   r   r   r   Ú<module>   sÆ    


24
ýþ
úýø÷þ
ÿÿùúòø
 |)x