o
    NZhp                     @  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 )_zMake 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 )NZsrc_rootr   )pathattrs r   _/var/www/auris/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I).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 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 r	dd |j D }dd |j D }||ksJ d S d S )NZ	read_attrz0.0.1)return_valueZ_expand_patterns)Z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>D       z>test_apply_pyproject_equivalent_to_setupcfg.<locals>.<genexpr>c                 s  r1   )entry_pointsNr3   r5   r   r   r   r7   G   r8   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   r7   J   r8   Htest_apply_pyproject_equivalent_to_setupcfg.<locals>.<setcomp>.<genexpr>sortedr#   kvr   r   r   	<setcomp>I       z>test_apply_pyproject_equivalent_to_setupcfg.<locals>.<setcomp>c                 S  r:   )c                 s  r;   r<   r>   r@   r   r   r   r7   N   r8   rB   rC   rE   r   r   r   rH   M   rI   c                 s  r1   )package_dataNr3   r5   r   r   r   r7   S   r8   c                 S      h | ]\}}|gt |R qS r   rC   rE   r   r   r   rH   T        c                 S  rK   r   rC   rE   r   r   r   rH   U   rL   c                 s  r1   )
data_filesNr3   r5   r   r   r   r7   X   r8   c                 S  rK   r   rC   rE   r   r   r   rH   Y   rL   c                 S  rK   r   rC   rE   r   r   r   rH   Z   rL   c                 s  r1   )extras_requireNr3   r5   r   r   r   r7   ^   r8   c                 S  rK   r   rC   rE   r   r   r   rH   _   rL   c                 S  rK   r   rC   rE   r   r   r   rH   `   rL   )setattrr
   r   r   r)   r   r   	read_textr   	translate
write_textr   apply_configurationr   r   core_metadataanysetr2   printr9   itemsrJ   rM   install_requiresrN   )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/   sP   

r]   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 = "криївка@оун-упа.укр"},
]
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 )Nr-   zreadme = "README.rst"z
readme = ""r.   r/   zhello worldLICENSE.txt--- LICENSE stub ---zspam.py)rX   r?   rR   PEP621_EXAMPLE_SCRIPT)r[   readmepyproject_text	pyprojecttextZreplacementsorigsubstr   r   r   _pep621_example_project   s   rh   c                 C  s2   t | }tt| |}t|jjdhksJ dS )z&Make sure the example in PEP 621 worksr_   N)rh   r   rS   r   rV   metadatar2   r[   rd   distr   r   r   test_pep621_example   s   rl   )rb   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rh   r   rS   r   ri   Zlong_description_content_type)r[   rb   rm   rd   rk   r   r   r   test_readme_content_type   s   
	rp   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)rh   pytestraises
ValueErrorr   rS   r   )r[   rd   r   r   r   test_undefined_content_type   s   
"rv   c                 C  s.   t | d}tt| |}|jjd u sJ d S )NREADMEro   rj   r   r   r   3test_no_explicit_content_type_for_missing_extension   s   
rx   )rc   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)marksrz   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 )Nrw   rc   PKG-FILEwr.   r/   zMaintainer-email: )	rh   r   rS   r   ri   Zmaintainer_emailopenwrite_pkg_filerP   )ry   rc   r[   rd   rk   pkg_filefhcontentr   r   r    test_utf8_maintainer_in_metadata   s   r   )rc   licenselicense_expressioncontent_strnot_content_strMITzLicense: MITzLicense-Expression: zlicense-textz6ignore:.project.license. as a TOML table is deprecated)rz   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 )Nrw   r~   r   r   r.   r/   zMetadata-Version: 2.4)
rh   r   rS   r   ri   r   r   r   r   rP   )r   r   r   r   rc   r[   rd   rk   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   rw   z/
    "License :: OSI Approved :: MIT License"
]z?License classifiers have been superseded by license expressionsrq   &License :: OSI Approved :: MIT License)PEP639_LICENSE_EXPRESSIONrsplitrh   rs   rt   r   r   rS   r   strvalue)r[   re   rd   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"]
    rw   z5License classifiers are deprecated(?:.|
)*MIT License/.project.license. as a TOML table is deprecatedrq   r   )	rh   rs   warnsr   r   rS   r   ri   Zget_classifiers)r[   re   rd   msg1msg2rk   r   r   r   2test_license_classifier_without_license_expressionj  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   rw   r~   )r   r    r!   rh   )selfr[   additional_textlicense_tomlre   rd   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.rstr_   zLicenseRef-Proprietary
r.   r/   zQ'tool.setuptools.license-files' is deprecated in favor of 'project.license-files'r   rq   )r   touchrR   rs   r   r   r   rS   r   rV   ri   r2   r   )r   r[   setuptools_configrd   r   r   r   rk   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.*LicenseRefrq   zLicenseRef-Proprietary)r   r   rs   r   r   r   rS   r   rV   ri   r2   r   r   )r   r[   rd   r   rk   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'rq   )r   rs   rt   r   r   rS   r   )r   r[   r   rd   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   r.   r/   r_   )
r   splitrR   r   rS   r   existsrV   ri   r2   )r   r[   r   rd   r2   fnamerk   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'rq   )
r   listglobrs   r   r   r   r   rS   r   )r   r[   rd   r   r   r   r   r   test_missing_patterns  s   
Pz&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   rq   Nr`   r_   )PEP621_EXAMPLEr?   rh   rs   r   r   r   rS   r   ri   r   rV   r2   )r   r[   re   rd   r   rk   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
]
        r-   r.   r/   )r   rR   r   r   rS   r   )r   namer\   rd   r   r   r   rk     s   zTestPyModules.distmodulezpip-runu   abc-d.λ-xyz-ec                 C  s"   | | || |jv sJ d S rn   )chdirrk   
py_modulesr   r[   rZ   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-modulesrq   )r   rs   rt   ru   rk   r   r   r   r   r   test_invalid_module_name  s   
"z&TestPyModules.test_invalid_module_nameN)	r   r   r   rk   rs   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   rR   r   rs   r   r   Z_ExperimentalConfigurationrS   r   lenZext_modulesr   rV   sources)r   r[   rZ   rd   r\   rk   r   r   r   test_pyproject_sets_attribute  s   
	 z,TestExtModules.test_pyproject_sets_attributeN)r   r   r   r   r   r   r   r   r         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-packagesrq   )rR   r   rs   rt   r   r   rS   r   )r   r[   rd   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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'
r-   r.   r/   )rR   )r   r[   ZdynamicZextra_contentr   filer   r   r   rd   <  s   zTestPresetField.pyproject)attrfieldr   )r   r   r   )r   r   zNot SPDXr}   zignore:.*license. overwrittenclassifierszPrivate :: Classifierr9   scriptsconsole_scriptsfoobar=foobar:maingui-scriptsgui_scriptszbazquux=bazquux:mainrY   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`:.*rq   N	metadata.)rd   r   r    compileSrs   r   r   r   rS   r   )	r   r[   r   r   r   rd   rk   r   
dist_valuer   r   r   test_not_listed_in_dynamicD  s   z*TestPresetField.test_not_listed_in_dynamicrN   zoptional-dependenciesc                 C  sR   |  ||g}t|fi ||i}t||}td| ||}||ks'J d S )Nr   )rd   r   r   rS   r   )r   r[   r   r   r   rd   rk   r   r   r   r   test_listed_in_dynamicb  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*)r2   ZLIC1Z42r.   r/   N)r   rd   r   rR   r   rS   ri   r2   )r   rZ   r[   rd   rk   r   r   r   &test_license_files_exempt_from_dynamics  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']
r-   r.   r/   wheelrY   z`install_requires` overwrittenrq   )rR   r   rs   r   r   rS   rY   )r   r[   srcrd   rk   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)rd   r   r   rS   rN   Zget_command_objr	   rP   )r   r[   extrard   install_reqrk   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   )r9   )rd   r   r   rS   r9   )r   r[   r   r   rd   rk   r   r   r   .test_scripts_dont_require_dynamic_entry_points  s   z>TestPresetField.test_scripts_dont_require_dynamic_entry_pointsNr   )r   r   r   rd   rs   r   r   paramfilterwarningsr   r   r   r   r   r   r   r   r   r   r   ;  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 rn   )endswithEXAMPLES_FILE)r#   r   r   r   r   r7     s    z6TestMeta.test_example_file_in_sdist.<locals>.<genexpr>N)tarfiler   rU   getnames)r   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   rR   r   r   rS   r   Zparse_command_lineZ
readouterrout)	r   r[   rZ   Zcapsysr\   rd   optsrk   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   rR   r   r   rS   r   r   rY   ri   keywordsr   Z	obsoletesZprovides	platforms)r   r[   rZ   r\   rd   rk   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StringIOri   r   getvaluer   Z
from_emailrV   add
splitlines
startswithappendjoin)rk   bufferZpkg_file_txtZskip_prefixesZ
skip_linesresultliner   r   r   rT     s"   



rT   )r   r   )L__doc__
__future__r   r   r    r   inspectr   pathlibr   Zunittest.mockr   rs   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   r   Zsetuptools.warningsr   r   Z	downloadsr   r   __file__parentZHEREr   r   r)   r   r   r   Zuses_networkr]   r   Z"PEP621_INTERNATIONAL_EMAIL_EXAMPLEra   ZPEP639_LICENSE_TEXTr   rh   rl   rp   rv   rx   r   Zxfailr   r   r   r   r   r   r   r   r   r   r   r   rT   r   r   r   r   <module>   s    

24



 |x