U
    uin0                  
   @   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   sh   t dddid}dddddd	i}|s*t|d
kr<||}n|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AssertionErrorjaracopathbuild)r   pkg_rootfilespackages r   N/tmp/pip-unpacked-wheel-9osl9suo/setuptools/tests/config/test_pyprojecttoml.pycreate_exampleU   s$     	
r!   c                 C   s4  |d }|j t| dd t| |}|d }t|dd|ksBt|d dksRt|d	 d
 dksftd|d d kszt|dkrt|d d d dhkstn"t|d d d dddhkst|d d d dkstd|d d d kstd|d d d kst|d d d ddgfgks0td S )Nr   utf-8encodingprojectTexpandversionz3.10readmetextr   r   tool
setuptoolsr   r   r   zother.nestedinclude-package-datar   zpackage-data*z
data-filesdataz_files/file.txt)
write_texttomli_wdumpsr   r   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 ks4t|d dd ksJtt|| d d S )Nsrcr   Fr&   r%   r(   r)   )r!   r   getr   r8   )tmp_pathr5   r4   r   r   r    test_read_configuration   s    
r<   zpkg_root, optsr   r9   libr   findwherec                 C   s   t | | | d }t|dd}|d dd ks4t|d dd ksJt|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:   r   popupdater8   )r;   r   optsr5   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   s<   t  }|t t|d ddd}|| W 5 Q R X 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   s0   d|pdddgi}ddddiii}|d|idS )	Ndynamicscriptsgui-scriptsentry-points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s4t|d d dksHtt|d dks\t|d d dksptt|d	 dkst|d	 d
 d dkstd S )Nr%   rX      rD   rE   rY   rF   rG   rZ   r   rH   rI   )rV   r   r5   lenr   )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   s\   |  | dddh|h }d| }tjtt|tjd t| || W 5 Q R X d S )NrX   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|dh|d	 d
< |d d d
 }ddi|d< t|| t||}t|d	 d ddhkst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   r   )rS   r;   ro   r5   r4   rW   Zdynamic_configr6   r   r   r    test_dynamic   s"    


zTestClassifiers.test_dynamicc              	   C   sD   d}|d }|j t|dd tjtdd t| W 5 Q R X 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sFtd S )Nzg
        [project]
        name = "myproj"
        version = '42'
        dynamic = ["readme"]
        r   r"   r#   long_description42)attrs)r0   r   r
   r   metadatars   r   )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   sT   d}|d }|j t|dd tjtdd t|}W 5 Q R X d|d ksPt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   r   )rS   r;   r4   r5   r6   r   r   r    test_dynamic_without_file  s    
z)TestClassifiers.test_dynamic_without_fileN)ri   rj   rk   rq   rr   rx   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 k	s*td S Nr   r"   r#   )r0   r   r   r   )r;   r|   r5   r   r   r    test_ignore_unrelated_config!  s    r~   zexample, error_msg)z
            [project]
            name = "myproj"
            version = "1.2"
            requires = ['pywin32; platform_system=="Windows"' ]
            zGconfiguration error: .project. must not contain ..requires.. propertiesc              	   C   s\   | d }|j t|dd td| dtjtjB }tjt|d t	| W 5 Q R X d S )Nr   r"   r#   zinvalid pyproject.toml.*z.*r`   )
r0   r   rd   re   Mrf   rb   rc   
ValueErrorr   )r;   r|   	error_msgr5   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&td S r}   r0   r   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ks6t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   sr   ddd}t jj|| d t|  tjjdi dd}W 5 Q R X | dksPt|	 d	ks`t|j
d
ksnt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_afterZmyprojrt   FN)r   r   r   r   	distutilscore	run_setupget_namer   get_versionZinclude_package_data)r;   r   rw   r   r   r    $test_include_package_data_in_setuppyb  s    
r   c              	   C   s@   d}| d }|j t|dd tt t| W 5 Q R X 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   ry   r   r   r   r   r   r    test_warn_tools_typov  s
    r   )(rd   configparserr   inspectr   Zjaraco.pathr   rb   r1   r   r   r,   Zsetuptools.config.pyprojecttomlr   r   r   r   r	   Zsetuptools.distr
   Z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

	

