o
    LK&h4X                     @   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   Y/var/www/html/venv/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   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_layoutfilesoptionsr   r   r    	_get_infoF   s   

z*TestDiscoverPackagesAndPyModules._get_infor9   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)endswithrC   filer   r    	<genexpr>U   s    zGTestDiscoverPackagesAndPyModules.test_sdist_filelist.<locals>.<genexpr>)r>   _populate_project_dir_run_sdist_programaticallyfilelistr<   any)r   r   r9   r<   r=   r:   cmdmanifestr   rI   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@   rC   r   r   r    	<setcomp>p        z@TestDiscoverPackagesAndPyModules.test_project.<locals>.<setcomp>)r>   rL   r   r   
_run_buildr   nextglobprintjoinsetr   )	r   r   r9   r<   r=   sdist_fileswheel_files
orig_filesrJ   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paramr9   )ri   rj   rk   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.pyr1   rk   r:   r5   rl   utf-8encoding)rn   r   r/   )r/   r   )r7   rL   r@   PURPOSEFULLY_EMPY
write_textformat	_get_distgetattr)r   r   rm   rn   r9   r<   template_param	pyprojectconfigrT   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>   namespace-stubs.pkgr"   namespace-stubsz&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 )Nr3   )r7   rL   ru   rd   r   )r   r   r|   r}   r<   rT   r   r   r    !test_flat_layout_with_extra_files   s   
zBTestDiscoverPackagesAndPyModules.test_flat_layout_with_extra_filesr|   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 )Nr3   multiple (packages|modules)matchr7   rL   pytestraisesr
   ru   )r   r   r|   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 )Nr4   zinvalid-module-name.pyr"   )r7   rL   ru   rd   r/   )r   r   r<   rT   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 )Nr4   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"rk   ro   rp   zfoo.py.Nz*.whl)
setuptoolsr   rs   r   r   jaracopathDirectoryStackcontextbuild_wheelr   r`   ra   )r   r   r   rx   rf   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__r8   r7   r>   r   markparametrizekeysrR   rh   r   rr   r   r{   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$   pkg3pkg4zns.nested.pkg1zns.nested.pkg2examplec                 C   s0   t || j| i  t|i }| |ksJ d S rG   )rL   EXAMPLESru   get_name)r   r   r   rT   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)rL   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__.pyri   ro   rp   r"   __init__.pyversion = 42z'[metadata]
version = attr: pkg.version
prefix42r   zdist/pkg-42.tar.gz)rL   	read_textr   r   rS   ru   r   get_versionr-   r   rA   existsr   partsr_   r   )
r   r   r   r   r<   ry   	overwriterT   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 )Nr1   r"   r   r   zh[project]
name = 'pkg'
dynamic = ['version']
[tool.setuptools.dynamic]
version = {attr = 'pkg.version'}
r   rk   r   r   r   r   )rL   r   r   rS   ru   r   r-   )r   r   r   rT   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)
        rj   ro   rp   rL   rs   r   )r   r   r<   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'
        rk   ro   rp   zQ
            [metadata]
            name = proj
            version = 42
        ri   projr   Nr   r   )r   rs   r   ru   r   r   r/   r   lenext_modulesr'   )r   r   rx   setupcfgrT   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'
        rk   ro   rp   r   r   N)r   rs   r   r   r   r
   ru   )r   r   rx   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.inro   rp   r   )r   r   src_rootr<   rQ   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   ri   rk   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   rU   rV   rW   rX   rY   c                 S   rZ   r[   r\   rC   r   r   r    r]     r^   z@TestWithPackageData.test_include_package_data.<locals>.<setcomp>N)r   r   rS   strr   rA   normpathr@   rB   r_   r   r`   ra   rb   rc   r   )r   r   r   r<   expectedre   rf   rg   r   r   r    test_include_package_data  s   *z-TestWithPackageData.test_include_package_dataN)r)   r*   r+   r   EXAMPLE_SETUPCFGEXAMPLE_PYPROJECT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)rL   r	   objectconfigurationset_defaultsr/   r   )r   r<   rT   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 )Nr2   r   z--namer"   )r   r   rS   r	   script_argsr   parse_command_liner   )
tmpdir_cwdrT   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 )Nmyproj)r   r   rT   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   rS   r	   r   r   setattrparse_config_filesr   rd   r   )r   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)rj   z	README.mdLICENSEr   c                 3   s    | ]} | V  qd S rG   r   rC   rootr   r    rK   F  s    z(_populate_project_dir.<locals>.<genexpr>Tr   )r   r   rS   _write_setupcfgparentr   r   )r   r<   r=   basicpathsr   r   r   r    rL   ;  s   

rL   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, rW   c                 s   s$    | ]\}}d | d| V  qdS )	z = Nr   )rD   kvr   r   r    rK   Y  s   " z"_write_setupcfg.<locals>.<genexpr>ri   wro   rp   z~~~~~ setup.cfg ~~~~~)rb   r   add_sectionitemsupdate
isinstancelistrc   dictr   openwriter   )r   r=   r   keyvalue	str_valuerE   r   r   r    r   L  s(   


r   c                 G   s*   t jdddg|t| }t|ddidS )Nz-mrS   z--no-isolationDISTUTILS_DEBUGr   )env)sys
executabler   r   )r   flagsrP   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?   rj   init)
stop_after)rc   rA   r   splitr   r   r   r	   	distutilscore	run_setupr   script_namer   r   )	dist_pathattrsr   scriptrT   r   r   r    ru   h  s$   


ru   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 rG   )	ru   r   ensure_finalizeddistributionr   r/   r   r   r   )r   r   rT   rP   r   r   r    rM   ~  s   

(rM   )/rA   r   configparserr   	itertoolsr   typingr   jaraco.pathr   r   r   r   r   setuptools.command.sdistr   setuptools.discoveryr   r   setuptools.distr	   setuptools.errorsr
   contextsr   integration.helpersr   r   r   textwrapr   distutils.corer   r   r,   r   r   r   r   r   r   r   rL   r   r_   ru   rM   r   r   r   r    <module>   s@     X0Ra	$