o
    5‘ði¦  ã                
   @  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( d dl)m*Z* d dl+m,Z, d dl-m.Z. ddl/m0Z0m1Z1 d dl2m3Z3 ej4ddgd�dd„ ƒZ5edƒedƒ 6¡ dddedƒedƒdd d!œid"œZ7d#Z8ej9j:ejd$kd%d&�ej9 ;d'i e7¥d(e8i¥e7g¡d)d*„ ƒƒZ<d+d,„ Z=d-d.„ Z>G d/d0„ d0ƒZ?G d1d2„ d2ƒZ@d3d4„ ZAG d5d6„ d6ƒZBd7d8„ ZCG d9d:„ d:ƒZDG d;d<„ d<ƒZEej9 Fd=¡d>d?„ ƒZGej9jHd@dA„ ƒZIG dBdC„ dCƒZJG dDdE„ dEƒZKG dFdG„ dGƒZLdHdI„ ZMej9 FdJ¡dKdL„ ƒZNdMdN„ ZOdOdP„ ZPdQdR„ ZQd^dXdY„ZRd_d\d]„ZSdS )`é    )ÚannotationsN)Údeepcopy)Úimport_module)ÚEXTENSION_SUFFIXES)ÚPath)Údedent)ÚAny)ÚMock)Úuuid4)Ú	resources)Ú_encode_pthÚ_find_namespacesÚ_find_package_rootsÚ_find_virtual_namespacesÚ_finder_templateÚ	_LinkTreeÚ_TopLevelFinderÚeditable_wheel)ÚDistribution)Ú	Extension)ÚSetuptoolsDeprecationWarningé   )ÚcontextsÚ
namespaces)Ú	run_setupÚstrictÚlenient)Úparamsc                 C  s   | j dkr	ddgS g S )Nr   ú--config-settingsúeditable-mode=strict)Úparam)Úrequest© r"   úe/root/parts/websockify/install/lib/python3.10/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|ƒg|¢}t| |¡ƒ g d	¢}| |¡ ¡ d
ks3J ‚|d jddd� |d jddd� | |¡ ¡ dksPJ ‚d S )Nr%   ©ÚprefixÚpythonú-mÚpipÚinstallú--no-build-isolationú-e)r3   r4   r%   z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Ú
write_text)Útmp_pathÚvenvr/   r$   ÚprojectÚcmdr"   r"   r#   Útest_editable_with_pyproject{   s&   	ùø
rK   c                 C  sz   dt dƒddiddœi}tjj|| d� | d }dd	d
dddt|ƒg|¢}t| |¡ƒ g d¢}| |¡ ¡ dks;J ‚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   )r3   ú-cz$import pkg, mod; print(pkg.a, mod.b)z4 2©r   r?   r@   rA   rB   rC   rD   rE   ©rG   rH   r$   r/   rI   rJ   r"   r"   r#   Útest_editable_with_flat_layoutœ   s.   ÿïÿùø
rQ   c                 C  st   dt dƒddœi}tjj|| d� | d }dddd	d
dt|ƒg|¢}t| |¡ƒ g d¢}| |¡ ¡ dks8J ‚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"]
                rL   )r(   r'   r1   r3   r4   r5   r6   r7   r8   )r3   rN   zimport mod; print(mod.b)Ú2rO   rP   r"   r"   r#   Ú test_editable_with_single_moduleÄ   s,   ÿñÿùø
rS   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 ]O}tj||dd�}|�; | ¡ �'}| |¡ tddd	�}	t	|	ƒ}
|
 
¡  |
 d
¡j}|
 ||¡ W d   ƒ n1 sNw   Y  W d   ƒ n1 s]w   Y  qt| d¡ƒ}t|ƒt|ƒkstJ ‚d S )Nz .*namespace_packages parameter.*©Úmatchz.installation_dir)z	myns.pkgAz	myns.pkgBúmyns.n.pkgAúmyns.n.pkgBÚ42)Úversionr0   Úconfig)Ú
stop_afterÚ	dist_infoz*-nspkg.pth)ÚpytestÚwarnsr   r>   r   Úbuild_namespace_packageÚcontextÚchdirr   r   Úfinalize_optionsÚget_finalized_commandÚnameÚ_install_namespacesÚlistÚglobÚlen)ÚselfrG   ÚmonkeypatchÚdeprecationÚinstallation_dirÚexamplesre   rM   ÚctxÚdistrJ   Ú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|ƒg|	¢¡ | d
ddddt|ƒg|	¢¡ | d
d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)rs   z.pkgBr(   r:   r;   Nr7   r3   r4   r5   r6   r8   rN   zimport z.pkgA; import )r   r`   rF   ÚappendrD   rB   )
rj   rH   rG   ru   rs   r$   Úbuild_systemÚpkg_AÚpkg_BÚoptsr"   r"   r#   Ú!test_namespace_package_importable  s   
"z6TestLegacyNamespaces.test_namespace_package_importableN)Ú__name__Ú
__module__Ú__qualname__rr   r^   ÚmarkÚparametrizer{   r"   r"   r"   r#   rT   ê   s    þrT   c                   @  s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚTestPep420Namespacesc              	   C  sz   t  |d¡}t  |d¡}|dd… }| d¡ | ddddt|ƒg|¢¡ | ddddd	t|ƒg|¢¡ | g d
¢¡ 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.
        rW   rX   Nr7   r3   r4   r5   r6   r8   )r3   rN   z&import myns.n.pkgA; import myns.n.pkgB)r   Úbuild_pep420_namespace_packagerv   rD   rB   )rj   rH   rG   r$   rx   ry   rz   r"   r"   r#   r{   +  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|ƒg|¢¡ | dddddt|ƒg|¢¡ | dddddt|ƒg|¢¡ | g d¢¡ 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   rX   zmyns.n.pkgCNr7   r3   r4   r5   r6   r8   )r3   rN   z#from myns.n import pkgA, pkgB, pkgC)	r   r?   r@   rA   r   r‚   rv   rD   rB   )	rj   rH   rG   r$   r/   rx   ry   Úpkg_Crz   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|ƒg|¢¡ | g d¢¡}| ¡ dksAJ ‚d}| ddt |ƒg¡}d|v sSJ ‚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   )r3   rN   z'from mypkg.n import pkgA; print(pkgA.a)Ú1z}        try:
            import mypkg.other
        except ImportError:
            print("mypkg.other not defined")
        rN   zmypkg.other not definedN)r   ÚEXAMPLEr?   r@   rA   rD   rB   rE   )rj   rH   rG   r/   rx   rz   ÚoutrJ   r"   r"   r#   Ú0test_namespace_accidental_config_in_lenient_mode\  s,   ÿþýéÿ zETestPep420Namespaces.test_namespace_accidental_config_in_lenient_modeN)r|   r}   r~   r{   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g	|¢}tj||d� t ¡ dkrLdnd}ˆ | d }tj|g|d� dS )z>
    Editable install to a prefix should be discoverable.
    r2   c                   s4   g | ]}d |v 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   ú
--editablez--prefixr7   )ÚenvÚWindowsÚScriptsÚbinÚsampleN)r�   r@   r>   Ú_addsitedirsÚdictÚosÚenvironÚpathsepÚjoinÚmaprB   Ú
executableÚ
subprocessÚ
check_callÚplatformÚsystem)	rG   Úsample_projectr$   Úsite_packages_allÚspr–   rJ   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)rj   Ú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 ¡ �@ dD ]	}t	j
 |d ¡ q8|  |¡ tdƒ}tdƒ}tdƒ}|jdksZJ ‚|jdksaJ ‚t|d  ¡ ƒ}	t||	ƒ W d   ƒ n1 sxw   Y  W d   ƒ d S W d   ƒ d S 1 s�w   Y  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   ÚaÚresolveÚassert_path)
rj   rG   r/   ÚmappingÚtemplateÚmodÚmod1r¹   r´   Úexpectedr"   r"   r#   Útest_packagesÂ  s0   þÿù	

þ
Pô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 ¡ �B dD ]	}t	j
 |d ¡ q0|  |¡ tdƒ}t |¡d	 }t|d  ¡ ƒ}	t||	ƒ |jd
ks^J ‚|jdd�dkshJ ‚W d   ƒ n1 srw   Y  W d   ƒ d S W d   ƒ d S 1 sŠw   Y  d S )NrM   úa = 13Úabc)r&   útext.txtr1   úns.othernameru   ©ru   rÎ   rÍ   é   r:   r;   )r?   r@   rA   rB   r   r
   r   r¾   r¿   r�   rÀ   rÁ   r±   r   Úimportlib_resourcesr/   rÃ   rÄ   rÂ   Ú	read_text)
rj   rG   r/   rÅ   r   rÆ   rÇ   rM   ÚtextrÉ   r"   r"   r#   Útest_namespaceâ  s    

Póz!TestFinderTemplate.test_namespacec           
   	   C  sD  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 ¡ �Y t ¡ �< dD ]	}t	j
 |d ¡ qG|  |¡ tdƒ}tdƒ}t|d	  ¡ ƒ}	t||	ƒ |jdksrJ ‚|jdksyJ ‚W d   ƒ n1 sƒw   Y  W d   ƒ d S W d   ƒ d S 1 s›w   Y  d S )Nru   r²   r&   rË   rµ   úb = 37r¶   r1   zsrc1/ns/pkg1zsrc2/ns)úns.pkgAru   r·   r¸   )ru   rÖ   úns.mod2rÖ   r×   rÐ   é%   )r?   r@   rA   rB   r   r
   r   r¾   r¿   r�   rÀ   rÁ   r±   r   rÃ   rÄ   rÂ   Úb)
rj   rG   r/   rÅ   Únamespaces_rÆ   rÇ   rƒ   r¹   rÉ   r"   r"   r#   Útest_combine_namespacesù  s(   
þ

þ

Põz*TestFinderTemplate.test_combine_namespacesc              	   C  sª  dddiidddiidœ}t j ¡ }| |¡�0 t j |¡ dd	d
dœddgdœ}t|ƒ}t|ttƒ ƒƒ}t	dd„ | 
¡ D ƒƒ}W d  ƒ n1 sJw   Y  t ¡ �x t ¡ �[ |d D ]	}tj |d¡ q]|  |¡ tdƒ}	tdƒ}
t|d  ¡ ƒ}tt|	jƒ ¡ ƒ|ks‰J ‚t|d  ¡ ƒ}tt|
jƒ ¡ ƒ|ksžJ ‚|	jdks¥J ‚|
jdks¬J ‚W d  ƒ n1 s¶w   Y  W d  ƒ dS W d  ƒ dS 1 sÎw   Y  dS )z�
        Users may attempt to combine namespace packages in a nested way via
        ``package_dir`` as shown in pypa/setuptools#4248.
        Ú
my_packagezmy_module.pyrË   Ú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>,  ó   €  zDTestFinderTemplate.test_combine_namespaces_nested.<locals>.<genexpr>Nrã   zdifferent_name.my_modulez different_name.subpkg.my_module2zsrc/my_package/my_module.pyzsrc2/my_package2/my_module2.pyrÐ   rØ   )r?   r@   ÚDirectoryStackra   rA   r   r   rB   r
   ÚnextÚget_implementationr   r¾   r¿   r�   rÀ   rÁ   r±   r   rÃ   r   Ú__file__rÂ   rÙ   )rj   rG   r/   ÚstackÚattrsrp   r¯   ÚcoderÇ   rÈ   r¹   rÉ   r"   r"   r#   Útest_combine_namespaces_nested  s:   

þ
þúô
Pñz1TestFinderTemplate.test_combine_namespaces_nestedc              
   C  sØ  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dg|¢R D ]	}t	j
 |d ¡ qM|  |¡ tdƒ}|jdksgJ ‚t t¡� tdƒ W d   ƒ n1 s{w   Y  t	j t|d ƒ¡ tdƒ}	|	jdks•J ‚t t¡� tdƒ W d   ƒ n1 s©w   Y  t	j t|d ƒ¡ tdƒ}
|
jdksÃJ ‚W d   ƒ n1 sÍw   Y  W d   ƒ d S W d   ƒ d S 1 såw   Y  d S )NÚparentÚchildzone.pyúx = 1ztwo.pyúx = 2zthree.pyzx = 3)Úproject1Úproject2Úproject3r1   zproject1/parentc                 s  s   � | ]}d |› �V  qdS )zparent.child.Nr"   )r‘   re   r"   r"   r#   rè   K  ó   € zCTestFinderTemplate.test_dynamic_path_computation.<locals>.<genexpr>)ÚoneÚtwoÚthreezparent.childzparent.child.oner   zparent.child.twor÷   é   zparent.child.threerø   é   )r?   r@   rA   rB   r   r
   r   r¾   r¿   r�   rÀ   rÁ   r±   r   Úxr^   ÚraisesÚImportErrorrv   )rj   rG   r/   rÅ   rÚ   rÆ   ÚmodsrÇ   rú   rû   rü   r"   r"   r#   Útest_dynamic_path_computation?  s8   ý

ÿ
ÿPë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 ¡ �L t ¡ �/ t	j
 dd ¡ |  |¡ tjtdd�� tdƒ W d   ƒ n1 sKw   Y  W d   ƒ n1 sZw   Y  W d   ƒ d S W d   ƒ d S 1 srw   Y  d S )NrM   r&   zfrom . import pkgr1   rU   ©r?   r@   rA   rB   r   r
   r   r¾   r¿   r�   rÀ   rÁ   r±   r^   r   r  r   ©rj   rG   r/   rÅ   rÆ   r"   r"   r#   Útest_no_recursionc  s    ÿÿÿ

ÿ€Pü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 ¡ �S t ¡ �6 t	j
 dd ¡ t	j
 dd ¡ |  |¡ tjtdd�� tdƒ W d   ƒ n1 sUw   Y  W d   ƒ n1 sdw   Y  W d   ƒ d S W d   ƒ d S 1 s|w   Y  d S )	NÚfoor‡   r&   )r&   Úbarr1   zfoo.barr9   rU   r  r  r"   r"   r#   Útest_similar_namex  s&   ÿþÿÿ

ÿ€Pûz$TestFinderTemplate.test_similar_namec              
   C  s   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 d   ƒ n1 sPw   Y  tjtdd	�� tdƒ W d   ƒ n1 skw   Y  tjtdd	�� tdƒ W d   ƒ n1 s†w   Y  tjtdd	�� tdƒ W d   ƒ n1 s¡w   Y  tjtdd	�� tdƒ W d   ƒ n1 s¼w   Y  tdƒ}|jdksÌJ ‚tdƒ}|jdks×J ‚W d   ƒ n1 sáw   Y  W d   ƒ d S W d   ƒ d S 1 sùw   Y  d S )Nr  r‡   rô   rõ   )r&   úlowercase.py)r&   r
  r  r1   z'FOO'rU   Ú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ÿ   )rj   rG   r/   rÅ   rÆ   rÇ   r"   r"   r#   Útest_case_sensitivity�  sF   þýÿ
ÿ

ÿ
ÿ
ÿ
ÿ
ÿPé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 ¡ q3|  |¡ tdƒ}t|d  ¡ ƒ}t||ƒ |jdksZJ ‚tdƒ}	|	jdkseJ ‚tdƒ}
|
jdkspJ ‚tjtdd�� tdƒ W d   ƒ n1 s†w   Y  tjtdd�� tdƒ W d   ƒ n1 s¡w   Y  tjtdd�� tdƒ W d   ƒ n1 s¼w   Y  W d   ƒ n1 sËw   Y  W d   ƒ d S W d   ƒ d S 1 sãw   Y  d S )NrM   rË   rÕ   zc = 42)r&   zbar.py)r&   r  r1   rÎ   ru   rÏ   rÐ   zns.othername.foorØ   zns.othername.foo.barr¼   z'NS'rU   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Â   rÙ   Úcr^   r   r  )rj   rG   r/   rÅ   r   rÆ   rÇ   rM   rÉ   r  r  r"   r"   r#   Útest_namespace_case_sensitivity¹  sD   þþÿ	


ÿ
ÿ
ÿ€Pêz2TestFinderTemplate.test_namespace_case_sensitivityc              
   C  s2  dddddddidœii}t jj||d	� dt|d
 ƒi}tttƒ ƒ|i ƒ}t ¡ �e t ¡ �H dD ]	}t	j
 |d¡ q2|  |¡ tdƒ}|jdksLJ ‚tdƒ}|jdksWJ ‚t t¡� tdƒ W d  ƒ n1 skw   Y  W d  ƒ n1 szw   Y  W d  ƒ dS W d  ƒ dS 1 s’w   Y  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Â   rÙ   r^   r   r  )rj   rG   r/   rÅ   rÆ   rÇ   r[   Ú
helloworldr"   r"   r#   Útest_intermediate_packagesâ  s4   ÿüÿÿ

ÿ€Píz-TestFinderTemplate.test_intermediate_packagesN)r|   r}   r~   Ú__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œ}g d¢}t||| ƒ}|t| d ƒt| d ƒt| d ƒt| d ƒt| d ƒt| d ƒdœks\J ‚ttt||ƒƒƒ}|ddhksmJ ‚tt|ƒƒ}|h d£ks{J ‚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.q)rÂ   úa.br  ú	a.b.c.x.yr   r  zd.er  úf.gzf.g.hr!  rÂ   r  r  )rÂ   r  r   r  r  r!  r$  >   úm.núm.n.oúa.b.c.xúm.n.o.pÚmr"  r#  N)	r?   r@   rA   r   rB   Úsetrœ   r   r   )rG   r/   râ   rã   Úrootsru   r"   r"   r#   Útest_pkg_roots  s4   úý





ú	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)   r0  r*   zÇ                [tool.setuptools]
                packages = ["mypkg", "mypkg.subpackage"]

                [tool.setuptools.package-dir]
                "mypkg.subpackage" = "other"
                r³   )r&   r³   r/  )r(   r)   r0  r%   r  )r³   r/  )úflat-layoutú
src-layoutúcustom-layoutÚ	namespacer+   r,   r-   Úlayoutc                 C  s<  t d||| j| g|¢R Ž \}}d}| ddt|ƒg¡}d|v s"J ‚d}	| ddt|	ƒg¡}d|v s4J ‚d}
| ddt|
ƒg¡}d	|v sFJ ‚t| d
¡ƒ}t| d¡ƒ}t| d¡ƒ}|jddd� |jddd� |jddd� | ddt|	ƒg¡}d|vs€J ‚d|v s†J ‚| ddt|
ƒg¡}d	|vs–J ‚d|v sœJ ‚d S )Nr%   zj        try:
            import otherfile
        except ImportError as ex:
            print(ex)
        r3   rN   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   rë   rh   rF   )rj   rG   rH   r6  r$   rI   Ú_Úcmd_import_errorrŒ   Úcmd_get_varsÚcmd_get_resourcerÈ   r¹   Úresource_filer"   r"   r#   Útest_editable_installƒ  s4   ÿÿz*TestOverallBehaviour.test_editable_installN)r|   r}   r~   Ú	PYPROJECTr   r‹   r1  Ú__annotations__r;  r^   r   Úxfailr�   r¥   r€   ÚkeysrA  r"   r"   r"   r#   r-  @  sX   
 ýýü
üÿÿ

þ
ï

þÿüå(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 )ÚTestLinkTreer3  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  sJ  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 u soJ ‚t| d¡d ƒd u s{J ‚t| d¡d ƒd u s‡J ‚t| d¡d ƒd u s“J ‚W d   ƒ d S 1 sžw   Y  d S )Nr1   zmypkg-3.14159rá   rÞ   z.auxz.buildÚbuild_pyTr7  zsrc/mypkg/mod1.pyz**/subpackager8  r9  z**/resource.not_in_manifest)r?   r@   rA   ÚFILESÚ_Pathr   Úparse_config_filesr	   r>   Úget_command_objÚeditable_moderB   Ú	build_libÚensure_finalizedÚget_outputsÚget_output_mappingr   rë   rh   Úassert_link_to)rj   rG   re   rp   ÚwheelÚauxrA   rH  ÚoutputsÚoutput_mappingÚ	make_treerÈ   rÉ   r"   r"   r#   Útest_generated_treeÉ  s4   



"ãz TestLinkTree.test_generated_treec                 C  s’   ddg}t d||| jg|¢R Ž  | g d¢¡}d|v sJ ‚d}| ddt|ƒg¡}d	|v s/J ‚d
}| ddt|ƒg¡}d|v sAJ ‚d|v sGJ ‚d S )Nr   r   r%   ©r3   rN   z(import mypkg.mod1; print(mypkg.mod1.var)rY   zv        try:
            from mypkg import subpackage
        except ImportError as ex:
            print(ex)
        r3   rN   ú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 directoryrG  )r:  rI  rD   r   )rj   rG   rH   rz   rŒ   r=  r?  r"   r"   r#   Útest_strict_installë  s   	z TestLinkTree.test_strict_installN)
r|   r}   r~   r   r-  r;  rI  r   rX  r[  r"   r"   r"   r#   rF  ¸  s    
ÿ"rF  z9ignore:.*compat.*:setuptools.SetuptoolsDeprecationWarningc                 C  s    ddg}t jd }td|| |g|¢R Ž  | g d¢¡}d|v s!J ‚tt| ƒƒ}dD ]}t| dd	|g¡ƒ}||v s;J ‚q)d
}| dd	t|ƒg¡}d|v sNJ ‚d S )Nr   zeditable-mode=compatr4  r%   rY  rY   )z"import otherfile; print(otherfile)zimport other; print(other)zimport mypkg; print(mypkg)r3   rN   zc    try:
        from mypkg import subpackage;
    except ImportError as ex:
        print(ex)
    rZ  )r-  r;  r:  rD   Úcomparable_pathrB   r   )rG   rH   rz   r/   rŒ   Úexpected_pathrJ   r"   r"   r#   Útest_compat_install  s   
r^  c                 C  sD   dddddd| g|¢}|j |tjd� |  g d¢¡}d	|v s J ‚d
S )z3Ensure editable installs work with pbr, issue #3500r3   r4   r5   r‰   r6   r•   ©Ústderr)r3   rN   zimport mypkg.hellozHello world!N)rD   r£   ÚSTDOUT)Úpbr_packagerH   r$   rJ   rŒ   r"   r"   r#   Útest_pbr_integration,  s   ùø
rc  c                   @  s2   e Zd ZdZi 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.
    r2  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  sJ   t d||| jƒ\}}d|v sJ ‚d|v sJ ‚| g d¢¡}d|v s#J ‚dS )z>Ensure that errors in custom build_py are reported as warningsr%   r   zValueError: TEST_RAISErY  rY   N)r:  rI  rD   )rj   rG   rH   r<  rŒ   r"   r"   r#   Útest_safeguarded_from_errors]  s
   z.TestCustomBuildPy.test_safeguarded_from_errorsN)	r|   r}   r~   r  r-  r;  r   rI  re  r"   r"   r"   r#   rd  >  s    ÿÿþrd  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)rj   r<  ©Ú	__class__r"   r#   rj  m  s   
zMTestCustomBuildWheel.install_custom_build_wheel.<locals>.MyBdistWheel.get_tag)r|   r}   r~   rj  Ú__classcell__r"   r"   rk  r#   ÚMyBdistWheell  s    rn  )Úget_command_classÚcmdclass)rj   rp   Úbdist_wheel_clsrn  r"   r"   r#   Úinstall_custom_build_wheeli  s   
z/TestCustomBuildWheel.install_custom_build_wheelc                 C  sj   t j ddi¡ tƒ }d|_| ¡  |  |¡ t|ƒ}| ¡  | 	¡  t
ttƒ  d¡ƒƒ}d|v s3J ‚d S )Nú	module.pyr=   r0   ú
dist/*.whlÚeditable)r?   r@   rA   r   rá   Úset_defaultsrr  r   rO  rD   rB   rë   r   rh   )rj   Ú
tmpdir_cwdrp   rJ   Ú
wheel_filer"   r"   r#   Útest_access_plat_namev  s   
z*TestCustomBuildWheel.test_access_plat_nameN)r|   r}   r~   rr  ry  r"   r"   r"   r#   rf  h  s    rf  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)r|   r}   r~   r"   r"   r"   r#   Ú
MyBuildExt‰  s    r|  r{  )Údistutils.command.build_extr{  rp  )rj   rp   Úbuild_ext_clsr|  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|v s=J ‚dd	„ tƒ  d
¡D ƒ}t|ƒdksPJ ‚|d j‰ t‡ fdd„tD ƒƒsbJ ‚d S )Nzmodule.cr‡   Úext_modulesÚmoduler0   rt  ru  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è   ¢  rù   zHTestCustomBuildExt.test_distutils_leave_inplace_files.<locals>.<genexpr>)r?   r@   rA   r   r   rá   rv  r  r   rO  rD   rB   rë   r   rh   ri   re   Úanyr   )rj   rw  rï   rp   rJ   rx  r/   r"   r‡  r#   Ú"test_distutils_leave_inplace_filesŽ  s    ÿ

z5TestCustomBuildExt.test_distutils_leave_inplace_filesN)
r|   r}   r~   r  r^   r   Úskipifr�   r¥   r‰  r"   r"   r"   r#   rz  …  s    
ÿrz  c                 C  s¬   t j ddi¡ tƒ }d|_| ¡  t|ƒ}| ¡  tdt	fi ƒ}t
|ƒ d�}| |d|¡ t |¡�}| ¡  W d  ƒ n1 sBw   Y  tdd	„ |jjD ƒƒsTJ ‚dS )
z7Make sure to display useful debugging tips to the user.rs  r=   r0   ÚSimulatedErr)Úside_effectrd   Nc                 s  s   � | ]}d |v V  qdS )zdebugging-tipsNr"   )r‘   Únoter"   r"   r#   rè   ´  s   € z&test_debugging_tips.<locals>.<genexpr>)r?   r@   rA   r   rá   rv  r   rO  ÚtypeÚ	Exceptionr	   Úsetattrr^   r   rD   rˆ  ÚvalueÚ	__notes__)rw  rk   rp   rJ   r‹  Úsimulated_failurero   r"   r"   r#   Útest_debugging_tips¥  s   
ÿr”  Úerrorc                  C  s   t dƒ} t| tƒsJ ‚dS )z>Ensure _encode_pth function does not produce encoding warningsu   tkmilan_Ã§_utf8N)r   Ú
isinstanceÚbytes)Úcontentr"   r"   r#   Útest_encode_pth·  s   r™  c              	   G  sZ   ||  }|  ¡  tjj||d� g |¢d‘}|jddddddt|ƒg|¢tjd	�}||fS )
Nr1   r7   r3   r4   r5   r‰   r6   r8   r_  )r>   r?   r@   rA   rD   rB   r£   ra  )re   rH   rG   r/   rz   rI   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‘   Únew_dirr"   r"   r#   rè   Ò  ré   z_addsitedirs.<locals>.<genexpr>r   zsitecustomize.pyr:   r;   N)r    ÚtuplerF   )Únew_dirsr˜  r"   r"   r#   r›   Ê  s   ÿÿr›   c                 C  s>   | j rtt| j ƒd ƒ}|rtt|ƒ ¡ ƒ|ksJ ‚d S d S d S r…  )Ú__path__rë   ÚiterrB   r   rÃ   )rM   rÉ   r@   r"   r"   r#   rÄ   Ú  s   ýrÄ   Úfiler   r  ÚreturnÚNonec                 C  sl   |   ¡ rt|  ¡ ƒt| ¡ ƒksJ ‚d S |  ¡ }| ¡ }|tj |tj ks(J ‚|tj |tj ks4J ‚d S r…  )Ú
is_symlinkrB   rÃ   ÚstatÚST_INOÚST_DEV)r¢  r  Ú	file_statÚ
other_statr"   r"   r#   rR  â  s    rR  Ústr_with_pathrB   c                 C  s   |   ¡  tjd¡ dd¡S )Nú/z//)ÚlowerÚreplacer�   Úsep)r«  r"   r"   r#   r\  ì  s   r\  )r¢  r   r  r   r£  r¤  )r«  rB   r£  rB   )TÚ
__future__r   r�   r¥   r¦  r£   r�   Úcopyr   Ú	importlibr   Úimportlib.machineryr   Úpathlibr   Útextwrapr   Útypingr   Úunittest.mockr	   Úuuidr
   Újaraco.envsr?   Újaraco.pathr^   r@   rJ  Úsetuptools._importlibr   rÑ   Ú!setuptools.command.editable_wheelr   r   r   r   r   r   r   r   Úsetuptools.distr   Úsetuptools.extensionr   Úsetuptools.warningsr   r‡   r   r   Údistutils.corer   Úfixturer$   rE   r‹   ÚSETUP_SCRIPT_STUBr   rD  r€   rK   rQ   rS   rT   r�   r«   r¬   r,  r-  rF  Úfilterwarningsr^  Úuses_networkrc  rd  rf  rz  r”  r™  r:  r›   rÄ   rR  r\  r"   r"   r"   r#   Ú<module>   s¦    (

ÿÿÿÿ
éÿ×Gþþ(&@e(  Z1x
S
 
* 



