U
    aÊ¹jo©  ã                
   @  sº  d dl mZ d dlZd dl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mZ d dlm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Zd dlmZ d dlmZ d dl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z) d dl*m+Z+ d dl,m-Z- d dl.m/Z/ ddl0m1Z1m2Z2 d dl3m4Z4 ej5ddgd�dd„ ƒZ6edƒedƒ 7¡ dddedƒedƒdd d!œid"œZ8d#Z9ej:j;ejd$kd%d&�ej: <d'e8d(e9i–e8g¡d)d*„ ƒƒZ=d+d,„ Z>d-d.„ Z?G d/d0„ d0ƒZ@G d1d2„ d2ƒZAd3d4„ ZBG d5d6„ d6ƒZCd7d8„ ZDG d9d:„ d:ƒZEG d;d<„ d<ƒZFej: Gd=¡d>d?„ ƒZHd@dA„ ZIG dBdC„ dCƒZJG dDdE„ dEƒZKG dFdG„ dGƒZLdHdI„ ZMej: GdJ¡dKdL„ ƒZNdMdN„ ZOdOdP„ ZPdQdR„ ZQdSdSdTœdUdV„ZRdWdWdXœdYdZ„ZSdS )[é    )ÚannotationsN)Údeepcopy)Úimport_module)ÚEXTENSION_SUFFIXES)ÚPath)Údedent)ÚAny)ÚMock)Úuuid4)Ú	resources)	Ú_DebuggingTipsÚ_encode_pthÚ_find_namespacesÚ_find_package_rootsÚ_find_virtual_namespacesÚ_finder_templateÚ	_LinkTreeÚ_TopLevelFinderÚeditable_wheel)ÚDistribution)Ú	Extension)ÚSetuptoolsDeprecationWarningé   )ÚcontextsÚ
namespaces)Ú	run_setupÚstrictZlenient)Úparamsc                 C  s   | j dkrddgS g S )Nr   ú--config-settingsúeditable-mode=strict)Úparam)Úrequest© r"   úe/var/www/html/bwave/python/venv/lib/python3.8/site-packages/setuptools/tests/test_editable_install.pyÚeditable_opts+   s    
r$   aý          [build-system]
        requires = ["setuptools"]
        build-backend = "setuptools.build_meta"

        [project]
        name = "mypkg"
        version = "3.14159"
        license = {text = "MIT"}
        description = "This is a Python package"
        dynamic = ["readme"]
        classifiers = [
            "Development Status :: 5 - Production/Stable",
            "Intended Audience :: Developers"
        ]
        urls = {Homepage = "https://github.com"}

        [tool.setuptools]
        package-dir = {"" = "src"}
        packages = {find = {where = ["src"]}}
        license-files = ["LICENSE*"]

        [tool.setuptools.dynamic]
        readme = {file = "README.rst"}

        [tool.distutils.egg_info]
        tag-build = ".post0"
        zr        global-include *.py *.txt
        global-exclude *.py[cod]
        prune dist
        prune build
        zThis is a ``README``z!---- placeholder MIT license ----Úmypkga                  import sys
                from importlib.metadata import PackageNotFoundError, version

                try:
                    __version__ = version(__name__)
                except PackageNotFoundError:
                    __version__ = "unknown"
                a                  from importlib.resources import read_text
                from . import __version__, __name__ as parent
                from .mod import x

                data = read_text(parent, "data.txt")
                print(__version__, data, x)
                zx = ''zHello World)ú__init__.pyz__main__.pyúmod.pyzdata.txt)úpyproject.tomlúMANIFEST.inz
README.rstzLICENSE.txtÚsrcz __import__('setuptools').setup()Údarwinúpypa/setuptools#4328©ÚreasonÚfilesúsetup.pyc                 C  s¦   | d }|  ¡  tjj||d� ddddddt|ƒf|•}t| |¡ƒ dddg}| |¡ ¡ d	ksht‚|d
 j	ddd� |d j	ddd� | |¡ ¡ dks¢t‚d S )Nr%   ©ÚprefixÚpythonú-mÚpipÚinstallú--no-build-isolationú-ez3.14159.post0 Hello Worldzsrc/mypkg/data.txtÚfoobarúutf-8©Úencodingzsrc/mypkg/mod.pyúx = 42z3.14159.post0 foobar 42)
ÚmkdirÚjaracoÚpathÚbuildÚstrÚprintÚrunÚstripÚAssertionErrorÚ
write_text)Útmp_pathÚvenvr/   r$   ÚprojectÚcmdr"   r"   r#   Útest_editable_with_pyproject|   s&    	ùø

rL   c                 C  s|   dt dƒddiddœi}tjj|| d� | d }dd	d
dddt|ƒf|•}t| |¡ƒ dddg}| |¡ ¡ dksxt‚d S )Nr%   ac                  [build-system]
                requires = ["setuptools", "wheel"]
                build-backend = "setuptools.build_meta"

                [project]
                name = "mypkg"
                version = "3.14159"

                [tool.setuptools]
                packages = ["pkg"]
                py-modules = ["mod"]
                r&   za = 4úb = 2)r(   Úpkgr'   r1   r3   r4   r5   r6   r7   r8   ú-cz$import pkg, mod; print(pkg.a, mod.b)z4 2©	r   r?   r@   rA   rB   rC   rD   rE   rF   ©rH   rI   r$   r/   rJ   rK   r"   r"   r#   Útest_editable_with_flat_layout�   s.    ÿïÿùø

rR   c                 C  sv   dt dƒddœi}tjj|| d� | d }dddd	d
dt|ƒf|•}t| |¡ƒ dddg}| |¡ ¡ dksrt‚d S )Nr%   a>                  [build-system]
                requires = ["setuptools", "wheel"]
                build-backend = "setuptools.build_meta"

                [project]
                name = "mod"
                version = "3.14159"

                [tool.setuptools]
                py-modules = ["mod"]
                rM   )r(   r'   r1   r3   r4   r5   r6   r7   r8   rO   zimport mod; print(mod.b)Ú2rP   rQ   r"   r"   r#   Ú test_editable_with_single_moduleÅ   s,    ÿñÿùø

rT   c                   @  s8   e Zd Zdd„ Zej dd¡ej dd¡dd„ ƒƒZd	S )
ÚTestLegacyNamespacesc                 C  sÄ   t jtdd�}|d }| ¡  d}|D ]v}tj||dd�}|�X | ¡ �D}| |¡ tddd	�}	t	|	ƒ}
|
 
¡  |
 d
¡j}|
 ||¡ W 5 Q R X W 5 Q R X q&t| d¡ƒ}t|ƒt|ƒksÀt‚d S )Nz .*namespace_packages parameter.*©Úmatchz.installation_dir)z	myns.pkgAz	myns.pkgBúmyns.n.pkgAúmyns.n.pkgBÚ42)Úversionr0   Úconfig)Ú
stop_afterZ	dist_infoz*-nspkg.pth)ÚpytestÚwarnsr   r>   r   Úbuild_namespace_packageÚcontextÚchdirr   r   Úfinalize_optionsÚget_finalized_commandÚnameZ_install_namespacesÚlistÚglobÚlenrF   )ÚselfrH   ÚmonkeypatchÚdeprecationZinstallation_dirZexamplesre   rN   ÚctxÚdistrK   Zeditable_namer/   r"   r"   r#   Útest_nspkg_file_is_uniqueî   s$     ÿ
"z.TestLegacyNamespaces.test_nspkg_file_is_uniqueÚimpl)Úpkg_resourcesÚns)zmyns.nc           
   	   C  sÖ   d}t j||› d�|d�}t j||› d�|d�}|d j|dd� |d j|dd� |dd… }	|	 d	¡ | d
dddt|ƒf|	•¡ | d
ddddt|ƒf|	•¡ | d
dd|› d|› d�g¡ | d
ddg¡ dS )a>  
        Installing two packages sharing the same namespace, one installed
        naturally using pip or `--single-version-externally-managed`
        and the other installed in editable mode should leave the namespace
        intact and both packages reachable by import.
        (Ported from test_develop).
        zq        [build-system]
        requires = ["setuptools"]
        build-backend = "setuptools.build_meta"
        z.pkgA)ro   z.pkgBr(   r:   r;   Nr7   r3   r4   r5   r6   r8   rO   zimport z.pkgA; import zimport pkg_resources)r   r`   rG   ÚappendrD   rB   )
ri   rI   rH   rq   ro   r$   Úbuild_systemÚpkg_AÚpkg_BÚoptsr"   r"   r#   Ú!test_namespace_package_importable  s    
z6TestLegacyNamespaces.test_namespace_package_importableN)Ú__name__Ú
__module__Ú__qualname__rn   r^   ÚmarkÚparametrizerw   r"   r"   r"   r#   rU   ë   s   þrU   c                   @  s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestPep420Namespacesc              	   C  s|   t  |d¡}t  |d¡}|dd… }| d¡ | ddddt|ƒf|•¡ | ddddd	t|ƒf|•¡ | dd
dg¡ dS )zÅ
        Installing two packages sharing the same namespace, one installed
        normally using pip and the other installed in editable mode
        should allow importing both packages.
        rX   rY   Nr7   r3   r4   r5   r6   r8   rO   z&import myns.n.pkgA; import myns.n.pkgB)r   Úbuild_pep420_namespace_packagerr   rD   rB   )ri   rI   rH   r$   rt   ru   rv   r"   r"   r#   rw   .  s    
z6TestPep420Namespaces.test_namespace_package_importablec           	   	   C  sÈ   dt dƒddidœi}tjj||d� |d }t |d¡}t |d¡}|d	d	… }| d
¡ | ddddt|ƒf|•¡ | dddddt|ƒf|•¡ | dddddt|ƒf|•¡ | dddg¡ d	S )z@Currently users can create a namespace by tweaking `package_dir`ÚpkgAat                      [build-system]
                    requires = ["setuptools", "wheel"]
                    build-backend = "setuptools.build_meta"

                    [project]
                    name = "pkgA"
                    version = "3.14159"

                    [tool.setuptools]
                    package-dir = {"myns.n.pkgA" = "src"}
                    r&   úa = 1)r(   r*   r1   rY   zmyns.n.pkgCNr7   r3   r4   r5   r6   r8   rO   z#from myns.n import pkgA, pkgB, pkgC)	r   r?   r@   rA   r   r~   rr   rD   rB   )	ri   rI   rH   r$   r/   rt   ru   Zpkg_Crv   r"   r"   r#   Ú&test_namespace_created_via_package_dir=  s"    ÿñÿ
z;TestPep420Namespaces.test_namespace_created_via_package_dirc              
   C  s¬   dt dƒdddddœdœtd d	œi}tjj||d
� |d }dg}| ddddddt|ƒf|•¡ | dddg¡}| ¡ dks„t‚d}| ddt |ƒg¡}d|ks¨t‚dS )a/  Sometimes users might specify an ``include`` pattern that ignores parent
        packages. In a normal installation this would ignore all modules inside the
        parent packages, and make them namespaces (reported in issue #3504),
        so the editable mode should preserve this behaviour.
        r   ar                      [build-system]
                    requires = ["setuptools", "wheel"]
                    build-backend = "setuptools.build_meta"

                    [project]
                    name = "pkgA"
                    version = "3.14159"

                    [tool.setuptools]
                    packages.find.include = ["mypkg.*"]
                    Ú zb = 1r€   )r&   zpkgA.py)r&   zother.pyÚnr)   )r(   r%   r)   r1   r7   r3   r4   r5   ú-vr6   r8   rO   z'from mypkg.n import pkgA; print(pkgA.a)Ú1z}        try:
            import mypkg.other
        except ImportError:
            print("mypkg.other not defined")
        zmypkg.other not definedN)	r   ÚEXAMPLEr?   r@   rA   rD   rB   rE   rF   )ri   rI   rH   r/   rt   rv   ÚoutrK   r"   r"   r#   Ú0test_namespace_accidental_config_in_lenient_mode_  s,    ÿþýéÿ zETestPep420Namespaces.test_namespace_accidental_config_in_lenient_modeN)rx   ry   rz   rw   r�   rˆ   r"   r"   r"   r#   r}   -  s   "r}   c           	   	     s¼   | d ‰ ‡ fdd„t jD ƒ}|D ]}|jdd� q t|ƒ ttjtj t	t
|ƒ¡d�}t jddd	d
t
|ƒdt
ˆ ƒdf	|•}tj||d� t ¡ dkr˜dnd}ˆ | d }tj|g|d� dS )z>
    Editable install to a prefix should be discoverable.
    r2   c                   s4   g | ],}d |kr|  tj¡rˆ t|ƒ tj¡ ‘qS )zsite-packages)Ú
startswithÚsysr2   r   Úrelative_to)Ú.0r@   r1   r"   r#   Ú
<listcomp>™  s    þz-test_editable_with_prefix.<locals>.<listcomp>T)Úparents)Ú
PYTHONPATHr4   r5   r6   z
--editablez--prefixr7   )ÚenvÚWindowsÚScriptsÚbinÚsampleN)rŠ   r@   r>   Ú_addsitedirsÚdictÚosÚenvironÚpathsepÚjoinÚmaprB   Ú
executableÚ
subprocessÚ
check_callÚplatformÚsystem)	rH   Zsample_projectr$   Zsite_packages_allÚspr�   rK   r“   Úexer"   r1   r#   Útest_editable_with_prefix’  s0    
þ÷
ör£   c                   @  sh   e Zd Z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d„ Zdd„ Zdd„ ZdS )ÚTestFinderTemplateúÍThis test focus in getting a particular implementation detail right.
    If at some point in time the implementation is changed for something different,
    this test can be modified or even excluded.
    c                 C  s   i }t |||ƒ |d ƒ  d S )Nr6   )Úexec)ri   ÚfinderÚlocr"   r"   r#   Úinstall_finderÀ  s    z!TestFinderTemplate.install_finderc           
   
   C  sô   ddddidœiddidœ}t jj||d	� t|d
 ƒt|d ƒdœ}tttƒ ƒ|i ƒ}t ¡ �Š t ¡ �v dD ]}t	j
 |d ¡ qp|  |¡ tdƒ}tdƒ}tdƒ}|jdks´t‚|jdksÂt‚t|d  ¡ ƒ}	t||	ƒ W 5 Q R X W 5 Q R X d S )NÚpkg1r‚   úmod1.pyza = 42)r&   Úsubpkgúmod2.pyza = 43©Úsrc1Úsrc2r1   z	src1/pkg1z	src2/mod2)rª   Úmod2)rª   úpkg1.subpkgúpkg1.subpkg.mod1r±   r³   r±   r²   é*   é+   zsrc1/pkg1/subpkg)r?   r@   rA   rB   r   r
   r   Ú
save_pathsÚsave_sys_modulesrŠ   ÚmodulesÚpopr©   r   ÚarF   ÚresolveÚassert_path)
ri   rH   r/   ÚmappingÚtemplateÚmodÚmod1r±   r¬   Úexpectedr"   r"   r#   Útest_packagesÅ  s.    þÿù	

þ
z TestFinderTemplate.test_packagesc           
   
   C  sè   ddddœi}t jj||d� dt|d ƒi}dg i}tttƒ ƒ||ƒ}t ¡ �Ž t ¡ �z dD ]}t	j
 |d ¡ q`|  |¡ tdƒ}t |¡d	 }t|d  ¡ ƒ}	t||	ƒ |jd
ks¼t‚|jdd�dksÐt‚W 5 Q R X W 5 Q R X d S )NrN   úa = 13Úabc)r&   útext.txtr1   úns.othernamerq   ©rq   rÆ   rÅ   é   r:   r;   )r?   r@   rA   rB   r   r
   r   r¶   r·   rŠ   r¸   r¹   r©   r   Úimportlib_resourcesr/   r»   r¼   rº   rF   Ú	read_text)
ri   rH   r/   r½   r   r¾   r¿   rN   ÚtextrÁ   r"   r"   r#   Útest_namespaceå  s    

z!TestFinderTemplate.test_namespacec           
   
   C  s
  ddddiiidddiidœ}t jj||d� t|d	 ƒt|d
 ƒdœ}dt|d ƒt|d ƒgi}tttƒ ƒ||ƒ}t ¡ �‚ t ¡ �n dD ]}t	j
 |d ¡ qŽ|  |¡ tdƒ}tdƒ}t|d	  ¡ ƒ}	t||	ƒ |jdksät‚|jdksòt‚W 5 Q R X W 5 Q R X d S )Nrq   rª   r&   rÃ   r­   úb = 37r®   r1   zsrc1/ns/pkg1zsrc2/ns)úns.pkgArq   r¯   r°   )rq   rÎ   úns.mod2rÎ   rÏ   rÈ   é%   )r?   r@   rA   rB   r   r
   r   r¶   r·   rŠ   r¸   r¹   r©   r   r»   r¼   rº   rF   Úb)
ri   rH   r/   r½   Únamespaces_r¾   r¿   r   r±   rÁ   r"   r"   r#   Útest_combine_namespacesü  s&    
þ

þ

z*TestFinderTemplate.test_combine_namespacesc              
   C  sb  dddiidddiidœ}t j ¡ }| |¡�V t j |¡ dd	d
dœddgdœ}t|ƒ}t|ttƒ ƒƒ}t	dd„ | 
¡ D ƒƒ}W 5 Q R X t ¡ �Æ t ¡ �² |d D ]}tj |d¡ q¦|  |¡ tdƒ}	tdƒ}
t|d  ¡ ƒ}tt|	jƒ ¡ ƒ|ksþt‚t|d  ¡ ƒ}tt|
jƒ ¡ ƒ|k�s*t‚|	jdk�s:t‚|
jdk�sJt‚W 5 Q R X W 5 Q R X dS )z�
        Users may attempt to combine namespace packages in a nested way via
        ``package_dir`` as shown in pypa/setuptools#4248.
        Z
my_packagezmy_module.pyrÃ   Zmy_package2zmy_module2.pyrÍ   )r*   r°   ú	%PEP 517%zsrc/my_packagezsrc2/my_package2)Údifferent_nameúdifferent_name.subpkgrÕ   rÖ   )Úscript_nameÚpackage_dirÚpackagesc                 s  s    | ]\}}|  d ¡r|V  qdS )z.pyN©Úendswith)rŒ   ÚkÚvr"   r"   r#   Ú	<genexpr>/  s     
 zDTestFinderTemplate.test_combine_namespaces_nested.<locals>.<genexpr>rÙ   Nzdifferent_name.my_modulez different_name.subpkg.my_module2zsrc/my_package/my_module.pyzsrc2/my_package2/my_module2.pyrÈ   rÐ   )r?   r@   ZDirectoryStackra   rA   r   r   rB   r
   ÚnextZget_implementationr   r¶   r·   rŠ   r¸   r¹   r©   r   r»   r   Ú__file__rF   rº   rÑ   )ri   rH   r/   ÚstackÚattrsrm   r§   Úcoder¿   rÀ   r±   rÁ   r"   r"   r#   Útest_combine_namespaces_nested  s6    

þ
þú 
z1TestFinderTemplate.test_combine_namespaces_nestedc                 C  sr  ddddiiiddddiiiddddiiid	œ}t jj||d
� i }dt|d ƒgi}tttƒ ƒ||ƒ}dd„ dD ƒ}t ¡ �ê t ¡ �Ö d|˜D ]}t	j
 |d ¡ q’|  |¡ tdƒ}|jdksÆt‚t t¡� tdƒ W 5 Q R X t	j t|d ƒ¡ tdƒ}	|	jdk�st‚t t¡� tdƒ W 5 Q R X t	j t|d ƒ¡ tdƒ}
|
jdk�sZt‚W 5 Q R X W 5 Q R X d S )NÚparentÚchildzone.pyúx = 1ztwo.pyúx = 2zthree.pyzx = 3)Zproject1Úproject2Úproject3r1   zproject1/parentc                 s  s   | ]}d |› �V  qdS )zparent.child.Nr"   )rŒ   re   r"   r"   r#   rÞ   N  s     zCTestFinderTemplate.test_dynamic_path_computation.<locals>.<genexpr>)ÚoneÚtwoÚthreeúparent.childzparent.child.oner   zparent.child.tworé   é   zparent.child.threerê   é   )rå   rî   rî   )r?   r@   rA   rB   r   r
   r   r¶   r·   rŠ   r¸   r¹   r©   r   ÚxrF   r^   ÚraisesÚImportErrorrr   )ri   rH   r/   r½   rÒ   r¾   Zmodsr¿   rë   rì   rí   r"   r"   r#   Útest_dynamic_path_computationB  s2    ý
z0TestFinderTemplate.test_dynamic_path_computationc                 C  s¤   dddii}t jj||d� dt|d ƒi}tttƒ ƒ|i ƒ}t ¡ �T t ¡ �@ t	j
 dd ¡ |  |¡ tjtdd�� tdƒ W 5 Q R X W 5 Q R X W 5 Q R X d S )NrN   r&   zfrom . import pkgr1   rV   ©r?   r@   rA   rB   r   r
   r   r¶   r·   rŠ   r¸   r¹   r©   r^   rò   ró   r   ©ri   rH   r/   r½   r¾   r"   r"   r#   Útest_no_recursionf  s     ÿÿ 
ÿ
z$TestFinderTemplate.test_no_recursionc                 C  s¸   ddddidœi}t jj||d� dt|d ƒi}tttƒ ƒ|i ƒ}t ¡ �b t ¡ �N t	j
 dd ¡ t	j
 dd ¡ |  |¡ tjtdd�� tdƒ W 5 Q R X W 5 Q R X W 5 Q R X d S )	NÚfoor‚   r&   )r&   Úbarr1   zfoo.barr9   rV   rõ   rö   r"   r"   r#   Útest_similar_name{  s$     ÿþÿ 
ÿ
z$TestFinderTemplate.test_similar_namec                 C  sh  ddddddœdœi}t jj||d� dt|d ƒi}tttƒ ƒ|i ƒ}t ¡ �� t ¡ �ø t	j
 dd ¡ |  |¡ tjtdd	�� td
ƒ W 5 Q R X tjtdd	�� tdƒ W 5 Q R X tjtdd	�� tdƒ W 5 Q R X tjtdd	�� tdƒ W 5 Q R X tjtdd	�� tdƒ W 5 Q R X tdƒ}|jdk�s8t‚tdƒ}|jdk�sPt‚W 5 Q R X W 5 Q R X d S )Nrø   r‚   rç   rè   )r&   úlowercase.py)r&   rû   rù   r1   z'FOO'rV   ZFOOz'foo\.LOWERCASE'zfoo.LOWERCASEz'foo\.bar\.Lowercase'zfoo.bar.Lowercasez
'foo\.BAR'zfoo.BAR.lowercasezFOO.bar.lowercasezfoo.lowercaser   zfoo.bar.lowercaserï   )r?   r@   rA   rB   r   r
   r   r¶   r·   rŠ   r¸   r¹   r©   r^   rò   ró   r   rñ   rF   )ri   rH   r/   r½   r¾   r¿   r"   r"   r#   Útest_case_sensitivity“  s<    þýÿ
 
ÿ
z(TestFinderTemplate.test_case_sensitivityc                 C  s^  dddddœdœi}t jj||d� dt|d ƒi}d	g i}tttƒ ƒ||ƒ}t ¡ �þ t ¡ �ê d
D ]}t	j
 |d ¡ qf|  |¡ tdƒ}t|d  ¡ ƒ}t||ƒ |jdks´t‚tdƒ}	|	jdksÊt‚tdƒ}
|
jdksàt‚tjtdd�� tdƒ W 5 Q R X tjtdd�� tdƒ W 5 Q R X tjtdd�� tdƒ W 5 Q R X W 5 Q R X W 5 Q R X d S )NrN   rÃ   rÍ   zc = 42)r&   zbar.py)r&   rø   r1   rÆ   rq   rÇ   rÈ   zns.othername.foorÐ   zns.othername.foo.barr´   z'NS'rV   zNS.othername.fooz'ns\.othername\.FOO\'zns.othername.FOOz'ns\.othername\.foo\.BAR\'zns.othername.foo.BAR)r?   r@   rA   rB   r   r
   r   r¶   r·   rŠ   r¸   r¹   r©   r   r»   r¼   rº   rF   rÑ   Úcr^   rò   ró   )ri   rH   r/   r½   r   r¾   r¿   rN   rÁ   rø   rù   r"   r"   r#   Útest_namespace_case_sensitivity¼  s:    þþÿ	

z2TestFinderTemplate.test_namespace_case_sensitivityc                 C  sä   dddddddidœii}t jj||d	� dt|d
 ƒi}tttƒ ƒ|i ƒ}t ¡ �† t ¡ �r dD ]}t	j
 |d¡ qd|  |¡ tdƒ}|jdks˜t‚tdƒ}|jdks®t‚t t¡� tdƒ W 5 Q R X W 5 Q R X W 5 Q R X dS )zˆ
        The finder should not import ``fullname`` if the intermediate segments
        don't exist (see pypa/setuptools#4019).
        r*   r%   r‚   rÃ   zb = 13ú	config.pyza = 37)r&   rÿ   zhelloworld.pyÚ
componentsr1   z	src/mypkg)r%   zmypkg.configúmypkg.helloworldzmypkg.componentsúmypkg.components.configúmypkg.components.helloworldNr  rÐ   r  rÈ   r  )r?   r@   rA   rB   r   r
   r   r¶   r·   rŠ   r¸   r¹   r©   r   rº   rF   rÑ   r^   rò   ró   )ri   rH   r/   r½   r¾   r¿   r\   Z
helloworldr"   r"   r#   Útest_intermediate_packageså  s0     ÿüÿÿ
z-TestFinderTemplate.test_intermediate_packagesN)rx   ry   rz   Ú__doc__r©   rÂ   rÌ   rÓ   rä   rô   r÷   rú   rü   rþ   r  r"   r"   r"   r#   r¤   º  s    +$))r¤   c                 C  s  ddiddœdddidœdd	dd
iiiddiddiddidœ}t jj|| d� ddddœ}dddddddddddg}t||| ƒ}|t| d ƒt| d ƒt| d ƒt| d ƒt| d ƒt| d ƒdœksÊt‚ttt||ƒƒƒ}|ddhksìt‚tt	|ƒƒ}|dd dd!d"d#d$hk�st‚d%S )&r¥   r&   zab = 1r€   )rÑ   r&   zd = 1zde = 1)r&   ÚeÚgÚhzfgh = 1zabc = 1z
abcxyz = 1z	mnopq = 1)rº   ÚdÚfÚotherÚanotherÚyet_anotherr1   r  r  r  )úa.b.cúa.b.c.x.y.zú	m.n.o.p.qrº   za.br  z	a.b.c.x.yr  r	  zd.er
  zf.gzf.g.hr  )rº   r  r  r	  r
  r  za.b.c.xÚmzm.nzm.n.ozm.n.o.pN)
r?   r@   rA   r   rB   rF   Úsetr–   r   r   )rH   r/   rØ   rÙ   Úrootsrq   r"   r"   r#   Útest_pkg_roots  sJ    úýõ





ú	r  c                
   @  sö   e Zd ZU dZeeƒed dddddddœdœd	œZd
ed< eeeƒed dded idœeeƒedƒ ed dded d dœed d dœeeƒed dded d ed d dœidœdœZe	j
jejdkdd�e	j
 de ¡ ¡dd„ ƒƒZdS )ÚTestOverallBehaviourz·        [build-system]
        requires = ["setuptools"]
        build-backend = "setuptools.build_meta"

        [project]
        name = "mypkg"
        version = "3.14159"
        r)   r‚   zvar = 42zvar = 13úresource 39)r&   r­   zresource_file.txt)r&   r«   Ú
subpackage)r(   r)   úotherfile.pyr%   zdict[str, Any]ÚFLAT_LAYOUTr%   )r(   r)   r  r*   zÇ                [tool.setuptools]
                packages = ["mypkg", "mypkg.subpackage"]

                [tool.setuptools.package-dir]
                "mypkg.subpackage" = "other"
                r«   )r&   r«   r  )r(   r)   r  r%   r  )r«   r  )úflat-layoutú
src-layoutúcustom-layoutÚ	namespacer+   r,   r-   Úlayoutc                 C  s@  t d||| j| f|žŽ \}}d}| ddt|ƒg¡}d|ksBt‚d}	| ddt|	ƒg¡}d|ksft‚d}
| ddt|
ƒg¡}d	|ksŠt‚t| d
¡ƒ}t| d¡ƒ}t| d¡ƒ}|jddd� |jddd� |jddd� | ddt|	ƒg¡}d|ksþt‚d|k�st‚| ddt|
ƒg¡}d	|k�s.t‚d|k�s<t‚d S )Nr%   zj        try:
            import otherfile
        except ImportError as ex:
            print(ex)
        r3   rO   zNo module named 'otherfile'zy        import mypkg, mypkg.mod1, mypkg.subpackage.mod2
        print(mypkg.mod1.var, mypkg.subpackage.mod2.var)
        z42 13zô        import mypkg.subpackage
        from setuptools._importlib import resources as importlib_resources
        text = importlib_resources.files(mypkg.subpackage) / "resource_file.txt"
        print(text.read_text(encoding="utf-8"))
        r  ú
**/mod1.pyú
**/mod2.pyú**/resource_file.txtzvar = 17r:   r;   z	var = 781zresource 374z17 781)Úinstall_projectÚEXAMPLESrD   r   rF   rß   rg   rG   )ri   rH   rI   r  r$   rJ   Ú_Úcmd_import_errorr‡   Zcmd_get_varsÚcmd_get_resourcerÀ   r±   Úresource_filer"   r"   r#   Útest_editable_install†  s:       ÿÿ
z*TestOverallBehaviour.test_editable_installN)rx   ry   rz   Z	PYPROJECTr   r†   r  Ú__annotations__r#  r^   r{   ÚxfailrŠ   rŸ   r|   Úkeysr(  r"   r"   r"   r#   r  C  sV   
ýýü
üÿÿ

þ
ï

þÿüå(r  c                   @  sN   e Zd Zeejd ƒZed  edƒ7  < ded d d< dd	„ Zd
d„ Z	dS )ÚTestLinkTreer  r(   a[          [tool.setuptools]
        # Temporary workaround: both `include-package-data` and `package-data` configs
        # can be removed after #3260 is fixed.
        include-package-data = false
        package-data = {"*" = ["*.txt"]}

        [tool.setuptools.packages.find]
        where = ["src"]
        exclude = ["*.subpackage*"]
        rÄ   r*   r%   úresource.not_in_manifestc              	   C  s:  t jj| j|d� t|ƒ�� d}tddiƒ}| ¡  tƒ }|d }|d }| ¡  | ¡  | 	d¡}d|_
t|ƒ|_| ¡  | ¡ }| ¡ }	t||||ƒ}
|
|||	ƒ t| d	¡ƒ}|d
 }t||ƒ t| d¡d ƒd ksàt‚t| d¡d ƒd ksøt‚t| d¡d ƒd k�st‚t| d¡d ƒd k�s,t‚W 5 Q R X d S )Nr1   zmypkg-3.14159r×   rÔ   z.auxz.buildÚbuild_pyTr  zsrc/mypkg/mod1.pyz**/subpackager   r!  z**/resource.not_in_manifest)r?   r@   rA   ÚFILESÚ_Pathr   Úparse_config_filesr	   r>   Úget_command_objZeditable_moderB   Ú	build_libÚensure_finalizedÚget_outputsZget_output_mappingr   rß   rg   Úassert_link_torF   )ri   rH   re   rm   ÚwheelZauxrA   r.  ÚoutputsZoutput_mappingZ	make_treerÀ   rÁ   r"   r"   r#   Útest_generated_treeÌ  s2    


z TestLinkTree.test_generated_treec                 C  s’   ddg}t d||| jf|žŽ  | dddg¡}d|ks:t‚d}| ddt|ƒg¡}d	|ks^t‚d
}| ddt|ƒg¡}d|ks‚t‚d|ksŽt‚d S )Nr   r   r%   r3   rO   ú(import mypkg.mod1; print(mypkg.mod1.var)rZ   zv        try:
            from mypkg import subpackage
        except ImportError as ex:
            print(ex)
        úcannot import name 'subpackage'a8          import mypkg
        from setuptools._importlib import resources as importlib_resources
        try:
            text = importlib_resources.files(mypkg) / "resource.not_in_manifest"
            print(text.read_text(encoding="utf-8"))
        except FileNotFoundError as ex:
            print(ex)
        zNo such file or directoryr-  )r"  r/  rD   rF   r   )ri   rH   rI   rv   r‡   r%  r&  r"   r"   r#   Útest_strict_installî  s    	z TestLinkTree.test_strict_installN)
rx   ry   rz   r   r  r#  r/  r   r9  r<  r"   r"   r"   r#   r,  »  s   
ÿ"r,  z9ignore:.*compat.*:setuptools.SetuptoolsDeprecationWarningc                 C  s    ddg}t jd }td|| |f|žŽ  | dddg¡}d|ksBt‚tt| ƒƒ}d	D ]$}t| dd|g¡ƒ}||ksRt‚qRd
}| ddt|ƒg¡}d|ksœt‚d S )Nr   zeditable-mode=compatr  r%   r3   rO   r:  rZ   )z"import otherfile; print(otherfile)zimport other; print(other)zimport mypkg; print(mypkg)zc    try:
        from mypkg import subpackage;
    except ImportError as ex:
        print(ex)
    r;  )r  r#  r"  rD   rF   Úcomparable_pathrB   r   )rH   rI   rv   r/   r‡   Zexpected_pathrK   r"   r"   r#   Útest_compat_install  s    
r>  c              	   C  s†   t dƒt dƒt dƒdddœddid	œ}| d
ddddg¡ tjdd�� td|| |f|žŽ  W 5 Q R X | d
ddg¡}d|ks‚t‚dS )z3Ensure editable installs work with pbr, issue #3500z�            [build-system]
            requires = ["setuptools"]
            build-backend = "setuptools.build_meta"
            zˆ            __import__('setuptools').setup(
                pbr=True,
                setup_requires=["pbr"],
            )
            z~            [metadata]
            name = mypkg

            [files]
            packages =
                mypkg
            r‚   zprint('Hello world!'))r&   zhello.pyztest.txtzAnother file in here.)r(   r0   z	setup.cfgr%   r  r3   r4   r5   r6   Zpbrz0.42)ZPBR_VERSIONr%   rO   zimport mypkg.hellozHello world!N)r   rD   r   Úenvironmentr"  rF   )rH   rI   r$   r/   r‡   r"   r"   r#   Útest_pbr_integration/  s&    ÿÿÿþâ r@  c                   @  s.   e Zd ZdZejd dedƒi–Zdd„ ZdS )ÚTestCustomBuildPya$  
    Issue #3501 indicates that some plugins/customizations might rely on:

    1. ``build_py`` not running
    2. ``build_py`` always copying files to ``build_lib``

    During the transition period setuptools should prevent potential errors from
    happening due to those assumptions.
    r  r0   af              import pathlib
            from setuptools import setup
            from setuptools.command.build_py import build_py as orig

            class my_build_py(orig):
                def run(self):
                    super().run()
                    raise ValueError("TEST_RAISE")

            setup(cmdclass={"build_py": my_build_py})
            c                 C  sL   t d||| jƒ\}}d|ks t‚d|ks,t‚| dddg¡}d|ksHt‚dS )	z>Ensure that errors in custom build_py are reported as warningsr%   r   zValueError: TEST_RAISEr3   rO   r:  rZ   N)r"  r/  rF   rD   )ri   rH   rI   r$  r‡   r"   r"   r#   Útest_safeguarded_from_errorsy  s
    z.TestCustomBuildPy.test_safeguarded_from_errorsN)	rx   ry   rz   r  r  r#  r   r/  rB  r"   r"   r"   r#   rA  Z  s    ÿþrA  c                   @  s   e Zd Zdd„ Zdd„ ZdS )ÚTestCustomBuildWheelc                 C  s(   |  d¡}G dd„ d|ƒ}||jd< d S )NÚbdist_wheelc                      s   e Zd Z‡ fdd„Z‡  ZS )zETestCustomBuildWheel.install_custom_build_wheel.<locals>.MyBdistWheelc                   s   | j  d¡rd}tƒ  ¡ S )Nzmacosx-zmacOS platform)Ú	plat_namer‰   ÚsuperÚget_tag)ri   r$  ©Ú	__class__r"   r#   rG  ‰  s    zMTestCustomBuildWheel.install_custom_build_wheel.<locals>.MyBdistWheel.get_tag)rx   ry   rz   rG  Ú__classcell__r"   r"   rH  r#   ÚMyBdistWheelˆ  s   rK  )Úget_command_classÚcmdclass)ri   rm   Zbdist_wheel_clsrK  r"   r"   r#   Úinstall_custom_build_wheel…  s    
z/TestCustomBuildWheel.install_custom_build_wheelc                 C  sj   t j ddi¡ tƒ }d|_| ¡  |  |¡ t|ƒ}| ¡  | 	¡  t
ttƒ  d¡ƒƒ}d|ksft‚d S )Nú	module.pyr=   r0   ú
dist/*.whlÚeditable)r?   r@   rA   r   r×   Úset_defaultsrN  r   r4  rD   rB   rß   r   rg   rF   )ri   Ú
tmpdir_cwdrm   rK   Ú
wheel_filer"   r"   r#   Útest_access_plat_name’  s    
z*TestCustomBuildWheel.test_access_plat_nameN)rx   ry   rz   rN  rU  r"   r"   r"   r#   rC  „  s   rC  c                   @  s2   e Zd Zdd„ Zejjejdkdd�dd„ ƒZ	dS )	ÚTestCustomBuildExtc                 C  s*   ddl m} G dd„ d|ƒ}||jd< d S )Nr   )Ú	build_extc                   @  s   e Zd ZdS )zITestCustomBuildExt.install_custom_build_ext_distutils.<locals>.MyBuildExtN)rx   ry   rz   r"   r"   r"   r#   Ú
MyBuildExt¥  s   rX  rW  )Zdistutils.command.build_extrW  rM  )ri   rm   Zbuild_ext_clsrX  r"   r"   r#   Ú"install_custom_build_ext_distutils¢  s    z5TestCustomBuildExt.install_custom_build_ext_distutilsÚlinuxz(compilers may fail without correct setupr-   c                   sÈ   t j ddi¡ dtddgƒgi}t|ƒ}d|_| ¡  |  |¡ t|ƒ}| 	¡  | 
¡  tttƒ  d¡ƒƒ}d|kszt‚dd	„ tƒ  d
¡D ƒ}t|ƒdks t‚|d j‰ t‡ fdd„tD ƒƒsÄt‚d S )Nzmodule.cr‚   Úext_modulesÚmoduler0   rP  rQ  c                 S  s   g | ]}|j d kr|‘qS )z.c)Úsuffix)rŒ   Úpr"   r"   r#   r�   »  s     
 zITestCustomBuildExt.test_distutils_leave_inplace_files.<locals>.<listcomp>zmodule.*r   r   c                 3  s   | ]}ˆ   |¡V  qd S ©NrÚ   )rŒ   Úext©re   r"   r#   rÞ   ¾  s     zHTestCustomBuildExt.test_distutils_leave_inplace_files.<locals>.<genexpr>)r?   r@   rA   r   r   r×   rR  rY  r   r4  rD   rB   rß   r   rg   rF   rh   re   Úanyr   )ri   rS  râ   rm   rK   rT  r/   r"   ra  r#   Ú"test_distutils_leave_inplace_filesª  s"     ÿ

z5TestCustomBuildExt.test_distutils_leave_inplace_filesN)
rx   ry   rz   rY  r^   r{   ZskipifrŠ   rŸ   rc  r"   r"   r"   r#   rV  ¡  s    ÿrV  c              
   C  sœ   t j ddi¡ tƒ }d|_| ¡  t|ƒ}| ¡  tdt	fi ƒ}t
|ƒ d�}| |d|¡ d}t |¡�( tjt|d�� | ¡  W 5 Q R X W 5 Q R X d	S )
z7Make sure to display useful debugging tips to the user.rO  r=   r0   ÚSimulatedErr)Zside_effectrd   z-following steps are recommended to help debugrV   N)r?   r@   rA   r   r×   rR  r   r4  ÚtypeÚ	Exceptionr	   Úsetattrr^   rò   r_   r   rD   )rS  rj   rm   rK   rd  Zsimulated_failureZexpected_msgr"   r"   r#   Útest_debugging_tipsÁ  s    rh  Úerrorc                  C  s   t dƒ} t| tƒst‚dS )z>Ensure _encode_pth function does not produce encoding warningsu   tkmilan_Ã§_utf8N)r   Ú
isinstanceÚbytesrF   )Úcontentr"   r"   r#   Útest_encode_pthÓ  s    rm  c              	   G  sV   ||  }|  ¡  tjj||d� |d
•}|jddddddt|ƒf|•tjd	�}||fS )Nr1   r7   r3   r4   r5   r„   r6   r8   )Ústderr)r7   )r>   r?   r@   rA   rD   rB   r�   ÚSTDOUT)re   rI   rH   r/   rv   rJ   r‡   r"   r"   r#   r"  Ú  s    þr"  c                 C  s6   d  dtdd„ | D ƒƒ ¡}| d d j|dd� d	S )
a5  To use this function, it is necessary to insert new_dir in front of sys.path.
    The Python process will try to import a ``sitecustomize`` module on startup.
    If we manipulate sys.path/PYTHONPATH, we can force it to run our code,
    which invokes ``addsitedir`` and ensure ``.pth`` files are loaded.
    Ú
)zimport sitec                 s  s    | ]}d t  |¡›d�V  qdS )zsite.addsitedir(ú)N)r—   Úfspath)rŒ   Znew_dirr"   r"   r#   rÞ   î  s     z_addsitedirs.<locals>.<genexpr>r   zsitecustomize.pyr:   r;   N)rš   ÚtuplerG   )Znew_dirsrl  r"   r"   r#   r•   æ  s    ÿÿr•   c                 C  s6   | j r2tt| j ƒd ƒ}|r2tt|ƒ ¡ ƒ|ks2t‚d S r_  )Ú__path__rß   ÚiterrB   r   r»   rF   )rN   rÁ   r@   r"   r"   r#   r¼   ö  s    r¼   r   )Úfiler  c                 C  sj   |   ¡ r&t|  ¡ ƒt| ¡ ƒksft‚n@|  ¡ }| ¡ }|tj |tj ksNt‚|tj |tj ksft‚d S r_  )Ú
is_symlinkrB   r»   rF   ÚstatÚST_INOÚST_DEV)rv  r  Z	file_statZ
other_statr"   r"   r#   r6  þ  s    r6  rB   )Ústr_with_pathÚreturnc                 C  s   |   ¡  tjd¡ dd¡S )Nú/z//)ÚlowerÚreplacer—   Úsep)r{  r"   r"   r#   r=    s    r=  )TÚ
__future__r   r—   rŸ   rx  r�   rŠ   Úcopyr   Ú	importlibr   Zimportlib.machineryr   Úpathlibr   Útextwrapr   Útypingr   Zunittest.mockr	   Úuuidr
   Zjaraco.envsr?   Zjaraco.pathr^   r@   r0  Zsetuptools._importlibr   rÉ   Z!setuptools.command.editable_wheelr   r   r   r   r   r   r   r   r   Zsetuptools.distr   Zsetuptools.extensionr   Zsetuptools.warningsr   r‚   r   r   Údistutils.corer   Zfixturer$   rE   r†   ZSETUP_SCRIPT_STUBr{   r*  r|   rL   rR   rT   rU   r}   r£   r¤   r  r  r,  Úfilterwarningsr>  r@  rA  rC  rV  rh  rm  r"  r•   r¼   r6  r=  r"   r"   r"   r#   Ú<module>   s    ,
ÿÿÿÿ
éÿ×G
þþ(&Be(  Z1xS

 +* 


