o
    Zh4X                     @   sX  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
Z
d dlmZ d dlZd dlmZ d dlmZmZ d dlm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 d dlZ G dd dZ!G dd dZ"G dd dZ#G dd dZ$G dd dZ%G dd dZ&dd Z'dd Z(dd Z)d d! Z*d"d# Z+d$d% Z,d&d' Z-d(d) Z.dS )*    N)ConfigParser)product)cast)Path)sdist)find_package_pathfind_parent_package)Distribution)PackageDiscoveryError   )quiet)get_sdist_membersget_wheel_membersrun)DALSc                   @   s   e Zd Zdd Zdd ZdS )TestFindParentPackagec                 C   sN   |d j ddd |d   |d   g d}t|ddi|d	ks%J d S )
Nzsrc/namespace/pkg/nestedTexist_okparentsz$src/namespace/pkg/nested/__init__.pyzsrc/namespace/pkg/__init__.py)	namespacenamespace.pkgznamespace.pkg.nested srcr   mkdirtouchr   )selftmp_pathpackages r   ]/var/www/html/lang_env/lib/python3.10/site-packages/setuptools/tests/test_config_discovery.pytest_single_package   s
   z)TestFindParentPackage.test_single_packagec                 C   sZ   g d}|D ]}|d|  j ddd |d| d   qt|ddi|d u s+J d S )N)pkgpkg1pkg2src/Tr   z/__init__.pyr   r   r   )r   r   Zmultiplenamer   r   r    test_multiple_toplevel!   s
   z,TestFindParentPackage.test_multiple_toplevelN)__name__
__module____qualname__r!   r'   r   r   r   r    r      s    r   c                   @   s  e Zd ZdZddidgddddiiddgid	dgidd
dgii i i i d	ZddgddgddgdgdgdZdd Zej	de
 dd Zej	de
 dd Zedededed d!Zej	d"eg d#dd	ge
 d$d% Zej	d&d'gdhfd(gdd)hfd*gdd+hfd,gh d-fd.gdd/hfd0gdhfd1gdhfgd2d3 Zej	d4d5gd6ggd7d8 Zd9d: Zd;d< Zd=d> Zd?S )@ TestDiscoverPackagesAndPyModuleszMake sure discovered values for ``packages`` and ``py_modules`` work
    similarly to explicit configuration for the simple scenarios.
    r   r   r"   )package_dirr   r,   libr   
py_modulesnszns.pkg)	zexplicit-srczvariation-libzexplicit-flatzexplicit-single_modulezexplicit-namespacezautomatic-srczautomatic-flatzautomatic-single_modulezautomatic-namespacesrc/pkg/__init__.pyzsrc/pkg/main.pyzlib/pkg/__init__.pyzlib/pkg/main.pyzpkg/__init__.pyzpkg/main.pypkg.pyzns/pkg/__init__.py)r   r-   flatsingle_moduler   c                 C   s,   | d\}}}| j| }| j| }||fS )N-)	partitionFILESOPTIONS)r   circumstance_Zlayoutfilesoptionsr   r   r    	_get_infoF   s   

z*TestDiscoverPackagesAndPyModules._get_infor8   c                    sb   |  |\}}t||| t||\}}dd |jjD }|D ] t fdd|D s.J qd S )Nc                 S   s   g | ]	}| tjd qS )/)replaceossep.0fr   r   r    
<listcomp>S   s    zHTestDiscoverPackagesAndPyModules.test_sdist_filelist.<locals>.<listcomp>c                 3   s    | ]}|  V  qd S N)endswithrA   filer   r    	<genexpr>U   s    zGTestDiscoverPackagesAndPyModules.test_sdist_filelist.<locals>.<genexpr>)r<   _populate_project_dir_run_sdist_programaticallyfilelistr:   any)r   r   r8   r:   r;   r9   cmdmanifestr   rG   r    test_sdist_filelistL   s   z4TestDiscoverPackagesAndPyModules.test_sdist_filelistc           	      C   s"  |  |\}}t||| |d   |d   |d   |d   |d   |d   |d   |d   t| tt|d	}td
 td	| |t
|ks]J tt|d}td td	| dd |D }||ks~J |D ]}d|vsJ d|vsJ qd S )Nbuildz	build/libzbuild/bdist.linux-x86_64z build/bdist.linux-x86_64/file.pyzbuild/lib/__init__.pyzbuild/lib/file.pydistzdist/file.pydist/*.tar.gz~~~~~ sdist_members ~~~~~

dist/*.whl~~~~~ wheel_members ~~~~~c                 S       h | ]}| d d ddqS r%   r   zlib/r>   rA   r   r   r    	<setcomp>p        z@TestDiscoverPackagesAndPyModules.test_project.<locals>.<setcomp>)r<   rJ   r   r   
_run_buildr   nextglobprintjoinsetr   )	r   r   r8   r:   r;   sdist_fileswheel_files
orig_filesrH   r   r   r    test_projectW   s0   z-TestDiscoverPackagesAndPyModules.test_projectz
            [metadata]
            name = myproj
            version = 0.0.0

            [options]
            {param} =
            z
            __import__('setuptools').setup(
                name="myproj",
                version="0.0.0",
                {param}=[]
            )
            z
            [build-system]
            requires = []
            build-backend = 'setuptools.build_meta'

            [project]
            name = "myproj"
            version = "0.0.0"

            [tool.setuptools]
            {param} = []
            zv
            [build-system]
            requires = []
            build-backend = 'setuptools.build_meta'
            )	setup.cfgsetup.pypyproject.tomltemplate-pyproject.toml)config_fileparamr8   )rg   rh   ri   c                 C   s   | j | g d }t||i  |dkr|dd}n| jd }|d j|dd |}| j| j|d}|| j|dd t|i }	t|	|g ksJJ d	d
d| }
t|	|
d u sZJ d S )N)zmod.pyzother.pyr0   ri   r9   r4   rj   utf-8encoding)rl   r   r.   )r.   r   )r6   rJ   r>   PURPOSEFULLY_EMPY
write_textformat	_get_distgetattr)r   r   rk   rl   r8   r:   Ztemplate_param	pyprojectconfigrR   otherr   r   r    test_purposefully_empty   s   	

z8TestDiscoverPackagesAndPyModules.test_purposefully_empty)extra_filespkgszvenv/bin/simulate_venvzpkg-stubs/__init__.pyiz	pkg-stubszother-stubs/__init__.pyizother-stubsz namespace-stubs/pkg/__init__.pyi>   r"   namespace-stubsznamespace-stubs.pkgz&namespace-stubs/pkg-stubs/__init__.pyir{   z_hidden/file.pyznews/finalize.pyc                 C   s:   | j d | }t||i  t|i }t|j|ksJ d S )Nr2   )r6   rJ   rs   rb   r   )r   r   ry   rz   r:   rR   r   r   r    !test_flat_layout_with_extra_files   s   
zBTestDiscoverPackagesAndPyModules.test_flat_layout_with_extra_filesry   zother/__init__.pyzother/finalize.pyc                 C   sX   | j d | }t||i  tjtdd t|i  W d    d S 1 s%w   Y  d S )Nr2   multiple (packages|modules)matchr6   rJ   pytestraisesr
   rs   )r   r   ry   r:   r   r   r    +test_flat_layout_with_dangerous_extra_files   s
   "zLTestDiscoverPackagesAndPyModules.test_flat_layout_with_dangerous_extra_filesc                 C   s>   | j d dg }t||i  t|i }t|jdhksJ d S )Nr3   zinvalid-module-name.pyr"   )r6   rJ   rs   rb   r.   )r   r   r:   rR   r   r   r    #test_flat_layout_with_single_module   s   
zDTestDiscoverPackagesAndPyModules.test_flat_layout_with_single_modulec                 C   sZ   | j d dg }t||i  tjtdd t|i  W d    d S 1 s&w   Y  d S )Nr3   zvalid_module_name.pyr}   r~   r   )r   r   r:   r   r   r    &test_flat_layout_with_multiple_modules   s
   "zGTestDiscoverPackagesAndPyModules.test_flat_layout_with_multiple_modulesc                 C   s   ddl m} d}|d jt|dd |d   tj | |	d W d	   n1 s1w   Y  t
t|d
}d|v sEJ d	S )zRegression for issue 3692r   )
build_metaz%[project]
name = "test"
version = "1"ri   rm   rn   zfoo.py.Nz*.whl)
setuptoolsr   rq   r   r   jaracopathZDirectoryStackcontextbuild_wheelr   r^   r_   )r   r   r   ru   rd   r   r   r    %test_py_modules_when_wheel_dir_is_cwd   s   zFTestDiscoverPackagesAndPyModules.test_py_modules_when_wheel_dir_is_cwdN)r(   r)   r*   __doc__r7   r6   r<   r   markparametrizekeysrP   rf   r   rp   r   rx   r|   r   r   r   r   r   r   r   r    r+   +   s    



!
	+





r+   c                   @   sT   e Zd ZdZdgdgddgddgdgd	gd
Zejde dd Z	dd Z
dS )TestNoConfigz0.0.0zsrc/pkg1.pyzsrc/pkg2/__init__.pyzsrc/pkg3/__init__.pyzsrc/pkg3-stubs/__init__.pyzpkg4/__init__.pyzpkg4-stubs/__init__.pyzsrc/ns/nested/pkg1/__init__.pyzns/nested/pkg2/__init__.py)r#   r$   Zpkg3Zpkg4zns.nested.pkg1zns.nested.pkg2examplec                 C   s0   t || j| i  t|i }| |ksJ d S rE   )rJ   EXAMPLESrs   get_name)r   r   r   rR   r   r   r    test_discover_name  s   
zTestNoConfig.test_discover_namec                 C   s>   dg}t ||i  t|d |d| j d }| sJ d S )Nzsrc/ns/nested/pkg/__init__.py--sdistzdist/ns_nested_pkg-z.tar.gz)rJ   r]   DEFAULT_VERSIONis_file)r   r   r:   	dist_filer   r   r    test_build_with_discovered_name  s
   
z,TestNoConfig.test_build_with_discovered_nameN)r(   r)   r*   r   r   r   r   r   r   r   r   r   r   r   r    r     s    	
r   c                   @   s@   e Zd Zejddi fddddidfgdd Zd	d
 ZdS )TestWithAttrDirective)folderoptsr   r-   zfind:where)r   packages.findc           
      C   s   | ddg}t ||| |d jdd}|dddiidd| i}tjj||d	 t|i }| dks6J | d
ks>J |jsCJ t	d|j|}t
j|sRJ |t| v s\J t|d |d }	|	 skJ d S )Nz/pkg/__init__.pyrg   rm   rn   r"   __init__.pyversion = 42z'[metadata]
version = attr: pkg.version
prefix42r   zdist/pkg-42.tar.gz)rJ   	read_textr   r   rQ   rs   r   get_versionr,   r   r?   existsr   partsr]   r   )
r   r   r   r   r:   rv   	overwriterR   package_pathr   r   r   r    test_setupcfg_metadata  s"   


z,TestWithAttrDirective.test_setupcfg_metadatac                 C   s`   t |dgi  dddiidd}tjj||d t|i }| dks%J |jd	d
iks.J d S )Nr0   r"   r   r   zh[project]
name = 'pkg'
dynamic = ['version']
[tool.setuptools.dynamic]
version = {attr = 'pkg.version'}
r   ri   r   r   r   r   )rJ   r   r   rQ   rs   r   r,   )r   r   r   rR   r   r   r    test_pyproject_metadata<  s   

z-TestWithAttrDirective.test_pyproject_metadataN)r(   r)   r*   r   r   r   r   r   r   r   r   r    r     s    
r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestWithCExtensionc                 C   s2   g d}t ||i  d}|d jt|dd d S )N)zbenchmarks/file.pyzdocs/Makefilezdocs/requirements.txtzdocs/source/conf.pyzproj/header.hzproj/file.pyzpy/proj.cppzpy/other.cppz
py/file.pyzpy/py.typedzpy/tests/test_proj.pyz
README.rsta^  
            from setuptools import Extension, setup

            ext_modules = [
                Extension(
                    "proj",
                    ["py/proj.cpp", "py/other.cpp"],
                    include_dirs=["."],
                    language="c++",
                ),
            ]
            setup(ext_modules=ext_modules)
        rh   rm   rn   rJ   rq   r   )r   r   r:   Zsetup_scriptr   r   r     _simulate_package_with_extensionN  s   z3TestWithCExtension._simulate_package_with_extensionc                 C   s   |  | d}|d jt|dd d}|d jt|dd t|i }| dks,J | dks4J |jd	u s;J |jd	u sBJ t|j	d
ksKJ |j	d j
dksUJ d	S )zEnsure that auto-discovery is not triggered when the project is based on
        C-extensions only, for backward compatibility.
        zr
            [build-system]
            requires = []
            build-backend = 'setuptools.build_meta'
        ri   rm   rn   zQ
            [metadata]
            name = proj
            version = 42
        rg   Zprojr   Nr   r   )r   rq   r   rs   r   r   r.   r   lenZext_modulesr&   )r   r   ru   setupcfgrR   r   r   r    *test_skip_discovery_with_setupcfg_metadatao  s   

z=TestWithCExtension.test_skip_discovery_with_setupcfg_metadatac                 C   sb   |  | d}|d jt|dd tjtdd t|i  W d   dS 1 s*w   Y  dS )a  When opting-in to pyproject.toml metadata, auto-discovery will be active if
        the package lists C-extensions, but does not configure py-modules or packages.

        This way we ensure users with complex package layouts that would lead to the
        discovery of multiple top-level modules/packages see errors and are forced to
        explicitly set ``packages`` or ``py-modules``.
        zT
            [project]
            name = 'proj'
            version = '42'
        ri   rm   rn   r}   r~   N)r   rq   r   r   r   r
   rs   )r   r   ru   r   r   r    0test_dont_skip_discovery_with_pyproject_metadata  s   
"zCTestWithCExtension.test_dont_skip_discovery_with_pyproject_metadataN)r(   r)   r*   r   r   r   r   r   r   r    r   M  s    !r   c                   @   s   e Zd Zdd ZdZdZdZej	ddde
eifdd	e
eifd
de
eifd
d	e
eifd
de
ee
d ifd
d	e
ee
d ifgdd ZdS )TestWithPackageDatac                 C   sF   | d| d| dg}t ||i  d}|d jt|dd d S )Nz/proj/__init__.py/proj/file1.txt/proj/nested/file2.txtz/
            global-include *.py *.txt
        zMANIFEST.inrm   rn   r   )r   r   src_rootr:   rO   r   r   r    !_simulate_package_with_data_files  s   z5TestWithPackageData._simulate_package_with_data_fileszd
    [metadata]
    name = proj
    version = 42

    [options]
    include_package_data = True
    z8
    [project]
    name = "proj"
    version = "42"
    z:
    [tool.setuptools]
    package-dir = {"" = "src"}
    )r   r:   r   rg   ri   r   z
                        packages = find:
                        package_dir =
                            =src

                        [options.packages.find]
                        where = src
                        zv
                        [tool.setuptools]
                        package-dir = {"" = "src"}
                        c                 C   s   t jj|t|d | || tj| dtjdtj| dtjdh}t	| t
t|d}td td| ||ksJJ tt|d}td	 td| d
d |D }||kskJ dS )zq
        Make sure auto-discovery does not affect package include_package_data.
        See issue #3196.
        r   r   r=   r   rS   rT   rU   rV   rW   c                 S   rX   rY   rZ   rA   r   r   r    r[     r\   z@TestWithPackageData.test_include_package_data.<locals>.<setcomp>N)r   r   rQ   strr   r?   normpathr>   r@   r]   r   r^   r_   r`   ra   r   )r   r   r   r:   expectedrc   rd   re   r   r   r    test_include_package_data  s   *z-TestWithPackageData.test_include_package_dataN)r(   r)   r*   r   ZEXAMPLE_SETUPCFGZEXAMPLE_PYPROJECTZPYPROJECT_PACKAGE_DIRr   r   r   r   r   r   r   r   r    r     s<    %r   c                 C   sL   g d}t | |i  ti }t |_|  |jd u sJ |jd u s$J d S )N)zdir1/__init__.pyzdir2/__init__.pyzfile.py)rJ   r	   objectconfigurationset_defaultsr.   r   )r   r:   rR   r   r   r    (test_compatible_with_numpy_configuration   s   r   c                 C   sD   t jddi ti }dg|_|  |  | dks J d S )Nr1   r   z--namer"   )r   r   rQ   r	   Zscript_argsr   Zparse_command_liner   )
tmpdir_cwdrR   r   r   r    $test_name_discovery_doesnt_break_cli  s   r   c                    s   dddiit dd}tj| ti   jj fdd}| jd|     	 d	ks4J t
 jdhks>J d
S )a
  According to #3545 it seems that ``name`` discovery is running,
    even when the project already explicitly sets it.
    This seems to be related to parsing of dynamic versions (via ``attr`` directive),
    which requires the auto-discovery of ``package_dir``.
    r"   r   z__version__ = 42
z
            [project]
            name = "myproj"  # purposefully different from package name
            dynamic = ["version"]
            [tool.setuptools.dynamic]
            version = {"attr" = "pkg.__version__"}
            r   c                      s        dksJ d S )NZmyproj)r   r   rR   Zorig_analyse_namer   r    spy_analyse_name/  s   zJtest_preserve_explicit_name_with_dynamic_version.<locals>.spy_analyse_nameanalyse_namer   N)r   r   r   rQ   r	   r   r   setattrparse_config_filesr   rb   r   )r   Zmonkeypatchr:   r   r   r   r    0test_preserve_explicit_name_with_dynamic_version  s   r   c                    s^   dddd}t jj| d t |  fdd|D }|D ]}|jjddd	 |  qd S )
Nz$import setuptools
setuptools.setup()z# Example PackagezCopyright (c) 2018)rh   z	README.mdLICENSEr   c                 3   s    | ]} | V  qd S rE   r   rA   rootr   r    rI   F  s    z(_populate_project_dir.<locals>.<genexpr>Tr   )r   r   rQ   _write_setupcfgparentr   r   )r   r:   r;   basicpathsr   r   r   r    rJ   ;  s   

rJ   c                 C   s  |st d d S t }|d | D ]L\}}|dkr/|d|  |d|  | qt|tr>d||d |< qt|trXddd | D }d| |d |< qt	||d |< qt
| d	 d
dd}|| W d    n1 szw   Y  t d t | d	 jdd d S )Nz~~~~~ **NO** setup.cfg ~~~~~r;   r   zoptions.z, rU   c                 s   s$    | ]\}}d | d| V  qdS )	z = Nr   )rB   kvr   r   r    rI   Y  s   " z"_write_setupcfg.<locals>.<genexpr>rg   wrm   rn   z~~~~~ setup.cfg ~~~~~)r`   r   add_sectionitemsupdate
isinstancelistra   dictr   openwriter   )r   r;   r   keyvalueZ	str_valuerC   r   r   r    r   L  s(   


r   c                 G   s*   t jdddg|t| }t|ddidS )Nz-mrQ   z--no-isolationZDISTUTILS_DEBUGr   )env)sys
executabler   r   )r   flagsrN   r   r   r    r]   c  s   r]   c                 C   s   d tj| }| d }| r2t|  tttj	j
di dd}W d    n1 s,w   Y  nt|}||_d|_t|  |  W d    n1 sOw   Y  |  |S )Nr=   rh   init)Z
stop_after)ra   r?   r   splitr   r   r   r	   	distutilscoreZ	run_setupr   script_namer   r   )	dist_pathattrsr   scriptrR   r   r   r    rs   h  s$   


rs   c              	   C   s   t | |}t|}|  |jjs|jjsJ t - t|  |  W d    n1 s.w   Y  W d    ||fS W d    ||fS 1 sJw   Y  ||fS rE   )	rs   r   Zensure_finalizeddistributionr   r.   r   r   r   )r   r   rR   rN   r   r   r    rK   ~  s   

(rK   )/r?   r   configparserr   	itertoolsr   typingr   Zjaraco.pathr   r   r   r   r   Zsetuptools.command.sdistr   Zsetuptools.discoveryr   r   Zsetuptools.distr	   Zsetuptools.errorsr
   Zcontextsr   Zintegration.helpersr   r   r   textwrapr   Zdistutils.corer   r   r+   r   r   r   r   r   r   r   rJ   r   r]   rs   rK   r   r   r   r    <module>   s@     X0Ra	$