o
    Zh>O                     @  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  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Z0de.fddZ1dd Z2ej)*d g d!d"d# Z3d$d% Z4d&d' Z5ej)*d(ej6e.d)d*d+ej6e/d,ej)j7d-d.d/d0d1fd2d3 Z8G d4d5 d5Z9G d6d7 d7Z:G d8d9 d9Z;G d:d; d;Z<G d<d= d=Z=G d>d? d?Z>G d@dA dAZ?G dBdC dCZ@dHdFdGZAdS )IzMake 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)RemovedConfigError   )retrieve_fileurls_from_filezsetupcfg_examples.txtc                 K  s   t d| i|S )NZsrc_rootr   )pathattrs r   g/var/www/html/lang_env/lib/python3.10/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sEJ tdd	 ||fD r\t|jt|jks\J td
d	 ||fD rt|j dd |j D }dd |j D }||ksJ tdd	 ||fD rdd |j D }dd |j D }||ksJ tdd	 ||fD rdd |jD }dd |jD }||ksJ t|jt|jksJ tdd	 ||fD rdd |j D }dd |j D }||ksJ d S d S )NZ	read_attrz0.0.1)return_valuepyproject.tomlutf-8encodingz	setup.cfgc                 s      | ]	}t |d dV  qdS )license_filesNgetattr.0dr   r   r   	<genexpr>8       z>test_apply_pyproject_equivalent_to_setupcfg.<locals>.<genexpr>c                 s  r!   )entry_pointsNr#   r%   r   r   r   r(   ;   r)   c                 S  *   h | ]\}}|gt d d |D R qS )c                 s      | ]	}| d dV  qdS   Nreplacer&   ir   r   r   r(   >   r)   Htest_apply_pyproject_equivalent_to_setupcfg.<locals>.<setcomp>.<genexpr>sortedr&   kvr   r   r   	<setcomp>=       z>test_apply_pyproject_equivalent_to_setupcfg.<locals>.<setcomp>c                 S  r+   )c                 s  r,   r-   r0   r2   r   r   r   r(   B   r)   r4   r5   r7   r   r   r   r:   A   r;   c                 s  r!   )package_dataNr#   r%   r   r   r   r(   G   r)   c                 S      h | ]\}}|gt |R qS r   r5   r7   r   r   r   r:   H        c                 S  r=   r   r5   r7   r   r   r   r:   I   r>   c                 s  r!   )
data_filesNr#   r%   r   r   r   r(   L   r)   c                 S  r=   r   r5   r7   r   r   r   r:   M   r>   c                 S  r=   r   r5   r7   r   r   r   r:   N   r>   c                 s  r!   )extras_requireNr#   r%   r   r   r   r(   R   r)   c                 S  r=   r   r5   r7   r   r   r   r:   S   r>   c                 S  r=   r   r5   r7   r   r   r   r:   T   r>   )setattrr
   r   r   r   	read_textr   	translate
write_textr   apply_configurationr   r   core_metadataanysetr"   printr*   itemsr<   r?   install_requiresr@   )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&   sJ   

rO   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)rJ   r1   rD   PEP621_EXAMPLE_SCRIPT)rM   readmepyproject_text	pyprojecttextZreplacementsorigsubstr   r   r   _pep621_example_project   s   rZ   c                 C  sB   t | }tt| |}|jjdksJ t|jjdhksJ dS )z&Make sure the example in PEP 621 worksrR   rQ   N)rZ   r   rE   r   metadatalicenserH   r"   rM   rV   distr   r   r   test_pep621_example   s   r_   )rT   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rZ   r   rE   r   r[   Zlong_description_content_type)rM   rT   r`   rV   r^   r   r   r   test_readme_content_type   s   
	rc   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)rZ   pytestraises
ValueErrorr   rE   r   )rM   rV   r   r   r   test_undefined_content_type   s   
"ri   c                 C  s.   t | d}tt| |}|jjd u sJ d S )NREADMErb   r]   r   r   r   3test_no_explicit_content_type_for_missing_extension   s   
rk   )rU   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)marksrm   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 )Nrj   )rU   zPKG-FILEwr   r   zMaintainer-email: )	rZ   r   rE   r   r[   Zmaintainer_emailopenwrite_pkg_filerB   )rl   rU   rM   rV   r^   Zpkg_filefhcontentr   r   r    test_utf8_maintainer_in_metadata   s   rv   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|v sJ d|vsJ | d| d}|j|dd |S )Nrj   r   r   z license = {file = "LICENSE.txt"}z[tool.setuptools]
)rZ   rB   rD   )selfrM   Zadditional_textrV   rW   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s3J |jj	dks;J d S )Nz,[tool.setuptools]
license-files = ["_FILE*"]z	_FILE.txtz	_FILE.rstrQ   zLicenseRef-Proprietary
r   r   )
rz   touchrD   r   rE   r   rH   r[   r"   r\   )ry   rM   setuptools_configrV   r\   r^   r   r   r   +test_both_license_and_license_files_defined  s   z<TestLicenseFiles.test_both_license_and_license_files_definedc                 C  sz   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 = falsez5LICENCE-a.html COPYING-abc.txt AUTHORS-xyz NOTICE,defrx   r   r   rQ   )
rz   splitrD   r   rE   r   existsrH   r[   r"   )ry   rM   r|   rV   r"   fnamer^   r   r   r   test_default_patterns  s    z&TestLicenseFiles.test_default_patternsN)__name__
__module____qualname__rz   r}   r   r   r   r   r   rw      s    rw   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
]
        r   r   r   )r   rD   r   r   rE   r   )ry   namerN   rV   r   r   r   r^   0  s   zTestPyModules.distmodulezpip-runu   abc-d.λ-xyz-ec                 C  s"   | | || |jv sJ d S ra   )chdirr^   
py_modulesry   rM   rL   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-modulesrd   )r   rf   rg   rh   r^   r   r   r   r   r   test_invalid_module_nameA  s   
"z&TestPyModules.test_invalid_module_nameN)	r   r   r   r^   rf   markparametrizer   r   r   r   r   r   r   -  s    
r   c                   @     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 d    n1 s-w   Y  t
|jdks;J |jd jdksEJ t|jd jdd	hksSJ 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   rD   r   rf   warnsr   Z_ExperimentalConfigurationrE   r   lenZext_modulesr   rH   sources)ry   rM   rL   rV   rN   r^   r   r   r   test_pyproject_sets_attributeI  s   
	 z,TestExtModules.test_pyproject_sets_attributeN)r   r   r   r   r   r   r   r   r   H      r   c                   @  r   )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 )Nr   z
        [project]
        name = "myproj"
        version = "42"
        [tool.setuptools]
        namespace-packages = ["myproj.pkg"]
        r   r   znamespace-packagesrd   )rD   r   rf   rg   r   r   rE   r   )ry   rM   rV   configr   r   r   test_namespace_packages^  s   "z,TestDeprecatedFields.test_namespace_packagesN)r   r   r   r   r   r   r   r   r   ]  r   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|vr|d7 }|d }|j || dd |S )Nz"[project]
name = 'proj'
dynamic = rx   versionzversion = '42'
r   r   r   )rD   )ry   rM   ZdynamicZextra_contentru   filer   r   r   rV   m  s   zTestPresetField.pyproject)attrfieldvalueclassifierszPrivate :: Classifierr*   scriptsconsole_scriptsfoobar=foobar:maingui-scriptsgui_scriptszbazquux=bazquux:mainrK   dependenciessixrp   z&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`:.*rd   N	metadata.)rV   r   recompileSrf   r   r   r   rE   r   )	ry   rM   r   r   r   rV   r^   msg
dist_valuer   r   r   test_not_listed_in_dynamicu  s   z*TestPresetField.test_not_listed_in_dynamicr@   zoptional-dependenciesc                 C  sR   |  ||g}t|fi ||i}t||}td| ||}||ks'J d S )Nr   )rV   r   r   rE   r   )ry   rM   r   r   r   rV   r^   r   r   r   r   test_listed_in_dynamic  s
   
z&TestPresetField.test_listed_in_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']
r   r   r   wheelrK   z`install_requires` overwrittenrd   )rD   r   rf   r   r   rE   rK   )ry   rM   srcrV   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   Zfooegg_infozrequires.txtr   r   zimportlib-resourcesbarz:python_version < "3.7"N)rV   r   r   rE   r@   Zget_command_objr	   rB   )ry   rM   extrarV   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*   )rV   r   r   rE   r*   )ry   rM   r   r   rV   r^   r   r   r   .test_scripts_dont_require_dynamic_entry_points  s   z>TestPresetField.test_scripts_dont_require_dynamic_entry_pointsN)r/   )r   r   r   rV   rf   r   r   paramfilterwarningsr   r   r   r   r   r   r   r   r   r   l  sB    







		
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 ra   )endswithEXAMPLES_FILE)r&   r   r   r   r   r(     s    z6TestMeta.test_example_file_in_sdist.<locals>.<genexpr>N)tarfilerr   rG   getnames)ry   Z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"
        r   r   r   Zscript_argsz	--versionz42.0)
r   r   rD   r   r   rE   r   Zparse_command_lineZ
readouterrout)	ry   rM   rL   ZcapsysrN   rV   optsr^   Z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"]
        r   r   r   )r   r   rD   r   r   rE   r   r   rK   r[   keywordsr   Z	obsoletesprovides	platforms)ry   rM   rL   rN   rV   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   returnstrc                 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/   rx   )ioStringIOr[   rs   getvaluer   Z
from_emailrH   add
splitlines
startswithappendjoin)r^   bufferZpkg_file_txtZskip_prefixesZ
skip_linesresultliner   r   r   rF     s"   



rF   )r   r   )B__doc__
__future__r   r   r   r   inspectr   pathlibr   Zunittest.mockr   rf   Zini2toml.apir   Zpackaging.metadatar   
setuptoolsZsetuptools._staticr   Z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_networkrO   ZPEP621_EXAMPLEZ"PEP621_INTERNATIONAL_EMAIL_EXAMPLErS   rZ   r_   rc   ri   rk   r   Zxfailrv   rw   r   r   r   r   r   r   r   rF   r   r   r   r   <module>   s    

/4	


/^