o
    !g>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 )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   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 )N	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/   r2   r4   r   r   r   r*   B   r+   r6   r7   r9   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   r7   r9   r   r   r   r<   H        c                 S  r?   r   r7   r9   r   r   r   r<   I   r@   c                 s  r#   )
data_filesNr%   r'   r   r   r   r*   L   r+   c                 S  r?   r   r7   r9   r   r   r   r<   M   r@   c                 S  r?   r   r7   r9   r   r   r   r<   N   r@   c                 s  r#   )extras_requireNr%   r'   r   r   r   r*   R   r+   c                 S  r?   r   r7   r9   r   r   r   r<   S   r@   c                 S  r?   r   r7   r9   r   r   r   r<   T   r@   )setattrr
   r   r   r   	read_textr   	translate
write_textr   apply_configurationr   r   core_metadataanysetr$   printr,   itemsr>   rA   install_requiresrB   )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_setupcfg&   sJ   

r`   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)rL   r3   rF   PEP621_EXAMPLE_SCRIPT)rO   readmepyproject_text	pyprojecttextreplacementsorigsubstr   r   r   _pep621_example_project   s   rl   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 worksrc   rb   N)rl   r   rG   r   metadatalicenserJ   r$   rO   rg   distr   r   r   test_pep621_example   s   rq   )re   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rl   r   rG   r   rm   long_description_content_type)rO   re   rr   rg   rp   r   r   r   test_readme_content_type   s   
	rv   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)rl   pytestraises
ValueErrorr   rG   r   )rO   rg   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READMErt   ro   r   r   r   3test_no_explicit_content_type_for_missing_extension   s   
r~   )rf   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)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}   )rf   zPKG-FILEwr    r!   zMaintainer-email: )	rl   r   rG   r   rm   maintainer_emailopenwrite_pkg_filerD   )r   rf   rO   rg   rp   pkg_filefhcontentr   r   r    test_utf8_maintainer_in_metadata   s   r   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 )Nr}   r    r!   z license = {file = "LICENSE.txt"}z[tool.setuptools]
)rl   rD   rF   )selfrO   additional_textrg   rh   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.rstrb   zLicenseRef-Proprietary
r    r!   )
r   touchrF   r   rG   r   rJ   rm   r$   rn   )r   rO   setuptools_configrg   rn   rp   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,defr   r    r!   rb   )
r   splitrF   r   rG   r   existsrJ   rm   r$   )r   rO   r   rg   r$   fnamerp   r   r   r   test_default_patterns  s    z&TestLicenseFiles.test_default_patternsN)__name__
__module____qualname__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
]
        r   r    r!   )r   rF   r   r   rG   r   )r   namerS   rg   r   r   r   rp   0  s   zTestPyModules.distmodulezpip-runu   abc-d.λ-xyz-ec                 C  s"   | | || |jv sJ d S rs   )chdirrp   
py_modulesr   rO   rN   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-modulesrw   )r   ry   rz   r{   rp   r   r   r   r   r   test_invalid_module_nameA  s   
"z&TestPyModules.test_invalid_module_nameN)	r   r   r   rp   ry   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   rF   r   ry   warnsr   _ExperimentalConfigurationrG   r   lenext_modulesr   rJ   sources)r   rO   rN   rg   rS   rp   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-packagesrw   )rF   r   ry   rz   r   r   rG   r   )r   rO   rg   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 )%TestPresetFieldr1   c                 C  s:   d|d}d|vr|d7 }|d }|j || dd |S )Nz"[project]
name = 'proj'
dynamic = r   versionzversion = '42'
r   r    r!   )rF   )r   rO   dynamicextra_contentr   filer   r   r   rg   m  s   zTestPresetField.pyproject)attrfieldvalueclassifierszPrivate :: Classifierr,   scriptsconsole_scriptsfoobar=foobar:maingui-scriptsgui_scriptszbazquux=bazquux:mainrM   dependenciessixr   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`:.*rw   N	metadata.)rg   r   recompileSry   r   r   r   rG   r   )	r   rO   r   r   r   rg   rp   msg
dist_valuer   r   r   test_not_listed_in_dynamicu  s   z*TestPresetField.test_not_listed_in_dynamicrB   zoptional-dependenciesc                 C  sR   |  ||g}t|fi ||i}t||}td| ||}||ks'J d S )Nr   )rg   r   r   rG   r   )r   rO   r   r   r   rg   rp   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rM   z`install_requires` overwrittenrw   )rF   r   ry   r   r   rG   rM   )r   rO   srcrg   rp   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.txtr    r!   zimportlib-resourcesbarz:python_version < "3.7"N)rg   r   r   rG   rB   get_command_objr	   rD   )r   rO   extrarg   install_reqrp   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,   )rg   r   r   rG   r,   )r   rO   r   r   rg   rp   r   r   r   .test_scripts_dont_require_dynamic_entry_points  s   z>TestPresetField.test_scripts_dont_require_dynamic_entry_pointsN)r1   )r   r   r   rg   ry   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 rs   )endswithEXAMPLES_FILE)r(   r   r   r   r   r*     s    z6TestMeta.test_example_file_in_sdist.<locals>.<genexpr>N)tarfiler   rI   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"
        r   r    r!   script_argsz	--versionz42.0)
r   r   rF   r   r   rG   r   parse_command_line
readouterrout)	r   rO   rN   capsysrS   rg   optsrp   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   rF   r   r   rG   r   r   rM   rm   keywordsr   	obsoletesprovides	platforms)r   rO   rN   rS   rg   rp   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:r1   r   )ioStringIOrm   r   getvaluer   
from_emailrJ   add
splitlines
startswithappendjoin)rp   bufferpkg_file_txtskip_prefixes
skip_linesresultliner   r   r   rH     s"   



rH   )r   r   )B__doc__
__future__r   r   r   r   inspectr   pathlibr   unittest.mockr   ry   ini2toml.apir   packaging.metadatar   
setuptoolssetuptools._staticr   setuptools.command.egg_infor	   setuptools.configr
   r   r   &setuptools.config._apply_pyprojecttomlr   r   setuptools.distr   setuptools.errorsr   	downloadsr   r   __file__parentHEREr   r   r   r   r   uses_networkr`   PEP621_EXAMPLE"PEP621_INTERNATIONAL_EMAIL_EXAMPLErd   rl   rq   rv   r|   r~   r   xfailr   r   r   r   r   r   r   r   r   rH   r   r   r   r   <module>   s    

/4	


/^