o
    LK&hv0                  
   @   s|  d dl Z d dlm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Zd dlmZmZmZmZmZ d dlmZ d dlmZ d dlZdZd	d
 Zdd Zdd Zejddi fdi fdddddgiiifgdd ZddiddiddidZG dd  d Z G d!d" d"Z!ejd#d$d%d& Z"ejd'd(gd)d* Z#ejd+d,d-d. Z$ejd+d/d0d1 Z%d2d3 Z&d4d5 Z'dS )6    N)ConfigParser)cleandoc)Path)_ToolsTypoInMetadataapply_configurationexpand_configurationread_configurationvalidate)Distribution)OptionErrora  
[project]
name = "myproj"
keywords = ["some", "key", "words"]
dynamic = ["version", "readme"]
requires-python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
dependencies = [
    'importlib-metadata>=0.12;python_version<"3.8"',
    'importlib-resources>=1.0;python_version<"3.7"',
    'pathlib2>=2.3.3,<3;python_version < "3.4" and sys.platform != "win32"',
]

[project.optional-dependencies]
docs = [
    "sphinx>=3",
    "sphinx-argparse>=0.2.5",
    "sphinx-rtd-theme>=0.4.3",
]
testing = [
    "pytest>=1",
    "coverage>=3,<5",
]

[project.scripts]
exec = "pkg.__main__:exec"

[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"

[tool.setuptools]
package-dir = {"" = "src"}
zip-safe = true
platforms = ["any"]

[tool.setuptools.packages.find]
where = ["src"]

[tool.setuptools.cmdclass]
sdist = "pkg.mod.CustomSdist"

[tool.setuptools.dynamic.version]
attr = "pkg.__version__.VERSION"

[tool.setuptools.dynamic.readme]
file = ["README.md"]
content-type = "text/markdown"

[tool.setuptools.package-data]
"*" = ["*.txt"]

[tool.setuptools.data-files]
"data" = ["_files/*.txt"]

[tool.distutils.sdist]
formats = "gztar"

[tool.distutils.bdist_wheel]
universal = true
c                 C   sp   t dddid}dddddd	i}|sJ |d
kr i ||}ni |ddddiii||< tjj|| d d S )Nhello worldzfile.txt )pyproject.tomlz	README.md_filespkgzclass CustomSdist: passzVERSION = (3, 10)zdef exec(): print('hello'))__init__.pyzmod.pyz__version__.pyz__main__.py.othernestedr   prefix)EXAMPLEjaracopathbuild)r   pkg_rootfilespackages r   ]/var/www/html/venv/lib/python3.10/site-packages/setuptools/tests/config/test_pyprojecttoml.pycreate_exampleU   s"   	r    c                 C   s.  |d }|j t| dd t| |}|d }t|dd|ks!J |d dks)J |d	 d
 dks3J d|d d v s=J |dkrQt|d d d dhksPJ nt|d d d h dksaJ |d d d du smJ d|d d d v syJ d|d d d vsJ |d d d ddgfgksJ d S )Nr   utf-8encodingprojectTexpandversionz3.10readmetextr   r   tool
setuptoolsr   r   >   other.nestedr   r   include-package-datar   zpackage-data*z
data-filesdataz_files/file.txt)
write_texttomli_wdumpsr   r   set)configr   r   	pyprojectexpandedexpanded_projectr   r   r   verify_exampler   s"   
  r8   c                 C   sZ   t | d | d }t|dd}|d dd u sJ |d dd u s%J t|| d d S )Nsrcr   Fr%   r$   r'   r(   )r    r   getr8   )tmp_pathr5   r4   r   r   r   test_read_configuration   s   
r<   )r   optsr   r9   libr   findwherec                 C   s   t | | | d }t|dd}|d dd u sJ |d dd u s%J |d d d	d  |d d d
d  |d d | t|| | d S )Nr   Fr%   r$   r'   r(   r*   r+   r   zpackage-dir)r    r   r:   popupdater8   )r;   r   r=   r5   r4   r   r   r   9test_discovered_package_dir_with_attr_directive_in_config   s   
	rC   a
mod.a:funcb
mod.b:funccmod.c:func [extra])console_scriptsgui_scriptsr   c                   @   s<   e Zd Zdd ZdddZdd Zejdd	d
d Z	dS )TestEntryPointsc                 C   sR   t  }|t t|d ddd}|| W d    d S 1 s"w   Y  d S )Nentry-points.txtwr!   r"   )r   	read_dictENTRY_POINTSopenwrite)selfr;   entry_pointsfr   r   r   write_entry_points   s
   
"z"TestEntryPoints.write_entry_pointsNc                 C   s.   d|pg di}ddddiii}|d|idS )Ndynamic)scriptsgui-scriptsentry-pointsrZ   filerM   r+   )r$   r*   r   )rS   rW   r$   r*   r   r   r   r5      s   zTestEntryPoints.pyprojectc                 C   s   |  | t|  |}|d }t|d dksJ |d d dks$J t|d dks.J |d d dks8J t|d	 dksBJ |d	 d
 d dksNJ d S )Nr$   rX      rD   rE   rY   rF   rG   rZ   r   rH   rI   )rV   r   r5   len)rS   r;   r6   r7   r   r   r   test_all_listed_in_dynamic   s   
z*TestEntryPoints.test_all_listed_in_dynamicmissing_dynamic)rX   rY   c                 C   sp   |  | h d|h }d| }tjtt|tjd t| || W d    d S 1 s1w   Y  d S )N>   rX   rY   rZ   z&defined outside of `pyproject.toml`:.*match)	rV   pytestraisesr   recompileSr   r5   )rS   r;   r_   rW   msgr   r   r   "test_scripts_not_listed_in_dynamic   s   

"z2TestEntryPoints.test_scripts_not_listed_in_dynamic)N)
__name__
__module____qualname__rV   r5   r^   rb   markparametrizerh   r   r   r   r   rL      s    
rL   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestClassifiersc                 C   s   t |d td}|d j|dd |d }t|dd}|d	 d
 }th |d|d	 d
< |d d d
 }ddi|d< t|| t||}t|d	 d ddhksTJ d S )Nr9   zX
            Framework :: Flask
            Programming Language :: Haskell
            zclassifiers.txtr!   r"   r   Fr%   r$   rW   classifiersr*   r+   r[   zFramework :: FlaskzProgramming Language :: Haskell)r    r   r0   r   listr	   r   r3   )rS   r;   ro   r5   r4   rW   dynamic_configr6   r   r   r   test_dynamic   s"   


zTestClassifiers.test_dynamicc                 C   sZ   d}|d }|j t|dd tjtdd t| W d    d S 1 s&w   Y  d S )Nzl
        [project]
        name = "myproj"
        version = '42'
        dynamic = ["classifiers"]
        r   r!   r"   z!No configuration .* .classifiers.r`   )r0   r   rb   rc   r   r   )rS   r;   r4   r5   r   r   r   test_dynamic_without_config   s   
"z+TestClassifiers.test_dynamic_without_configc                 C   sJ   d}|d }|j t|dd tddid}t||}|jjdks#J d S )Nzg
        [project]
        name = "myproj"
        version = '42'
        dynamic = ["readme"]
        r   r!   r"   long_description42)attrs)r0   r   r
   r   metadatart   )rS   r;   r4   r5   distr   r   r   *test_dynamic_readme_from_setup_script_args  s   
z:TestClassifiers.test_dynamic_readme_from_setup_script_argsc                 C   sh   d}|d }|j t|dd tjtdd t|}W d    n1 s%w   Y  d|d vs2J d S )	Nz
        [project]
        name = "myproj"
        version = '42'
        dynamic = ["classifiers"]

        [tool.setuptools.dynamic]
        classifiers = {file = ["classifiers.txt"]}
        r   r!   r"   z'File .*classifiers.txt. cannot be foundr`   ro   r$   )r0   r   rb   warnsUserWarningr   )rS   r;   r4   r5   r6   r   r   r   test_dynamic_without_file  s   

z)TestClassifiers.test_dynamic_without_fileN)ri   rj   rk   rr   rs   ry   r|   r   r   r   r   rn      s
    rn   example)z
        [project]
        name = "myproj"
        version = "1.2"

        [my-tool.that-disrespect.pep518]
        value = 42
        c                 C   s.   | d }|j t|dd t|d usJ d S Nr   r!   r"   )r0   r   r   )r;   r}   r5   r   r   r   test_ignore_unrelated_config!  s   r   )r}   	error_msg)z
            [project]
            name = "myproj"
            version = "1.2"
            requires = ['pywin32; platform_system=="Windows"' ]
            zGconfiguration error: .project. must not contain ..requires.. propertiesc                 C   sr   | d }|j t|dd td| dtjtjB }tjt|d t	| W d    d S 1 s2w   Y  d S )Nr   r!   r"   zinvalid pyproject.toml.*z.*r`   )
r0   r   rd   re   Mrf   rb   rc   
ValueErrorr   )r;   r}   r   r5   patternr   r   r   test_invalid_example6  s   
"r   r4   )r   z[tool.something]
value = 42c                 C   s*   | d }|j |dd t|i ksJ d S r~   r0   r   r;   r4   r5   r   r   r   
test_emptyM  s   r   )'[project]
name = 'myproj'
version='42'
c                 C   s:   | d }|j |dd t|}|d d d du sJ dS )	zaBuilds with ``pyproject.toml`` should consider ``include-package-data=True`` as
    default.
    r   r!   r"   r*   r+   r-   TNr   r   r   r   r   $test_include_package_data_by_defaultV  s   r   c                 C   s   ddd}t jj|| d t|  tjjdi dd}W d   n1 s%w   Y  | d	ks2J | d
ks:J |j	du sAJ dS )zBuilds with ``pyproject.toml`` should consider ``include_package_data`` set in
    ``setup.py``.

    See https://github.com/pypa/setuptools/issues/3197#issuecomment-1079023889
    r   z:__import__('setuptools').setup(include_package_data=False))r   setup.pyr   r   r4   )
stop_afterNmyprojru   F)
r   r   r   r   	distutilscore	run_setupget_nameget_versioninclude_package_data)r;   r   rx   r   r   r   $test_include_package_data_in_setuppyb  s   
r   c                 C   sV   d}| d }|j t|dd tt t| W d   dS 1 s$w   Y  dS )zTest that the common ``tools.setuptools`` typo in ``pyproject.toml`` issues a warning

    See https://github.com/pypa/setuptools/issues/4150
    z
    [build-system]
    requires = ["setuptools"]
    build-backend = "setuptools.build_meta"

    [project]
    name = "myproj"
    version = '42'

    [tools.setuptools]
    packages = ["package"]
    r   r!   r"   N)r0   r   rb   rz   r   r   r   r   r   r   test_warn_tools_typov  s   
"r   )(rd   configparserr   inspectr   jaraco.pathr   rb   r1   r   r   r+   setuptools.config.pyprojecttomlr   r   r   r   r	   setuptools.distr
   setuptools.errorsr   distutils.corer   r   r    r8   r<   rl   rm   rC   rP   rL   rn   r   r   r   r   r   r   r   r   r   r   <module>   s^    >
!K

	

