U
    ui                     @   st   d Z ddlZddlZddlZddlZddlmZmZ ddlm	Z	 ddl
mZ G dd dZG d	d
 d
Zdd ZdS )z%Tests for automatic package discovery    N)find_namespace_packagesfind_packages)FlatLayoutPackageFinder   )	os_helperc                   @   s   e Zd Zdd Zdd Zdd Zd(dd	Zd)d
dZdd Zdd Z	dd Z
dd Zdd Zdd Zejje  dddd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' ZdS )*TestFindPackagesc                 C   s   t  | _|   d S N)tempfilemkdtempdist_dir_make_pkg_structureselfmethod r   G/tmp/pip-unpacked-wheel-9osl9suo/setuptools/tests/test_find_packages.pysetup_method   s    
zTestFindPackages.setup_methodc                 C   s   t | j d S r   )shutilrmtreer   r   r   r   r   teardown_method   s    z TestFindPackages.teardown_methodc                 C   s   |  d| j| _| d| j |  d| j| _|  d| j |  d| j| _| d| j |  d| j| _|  d| j| _| d	| j | d
| j | d| j dS )aG  Make basic package structure.

        dist/
            docs/
                conf.py
            pkg/
                __pycache__/
                nspkg/
                    mod.py
                subpkg/
                    assets/
                        asset
                    __init__.py
            setup.py

        docszconf.pypkg__pycache__Znspkgzmod.pyZsubpkgZassetsZasset__init__.pyzsetup.pyN)_mkdirr   docs_dir_touchpkg_dirZ
ns_pkg_dirsub_pkg_dirZ	asset_dir)r   r   r   r   r      s    z$TestFindPackages._make_pkg_structureNc                 C   s    |rt j||}t | |S r   )ospathjoinmkdir)r   r    
parent_dirr   r   r   r   4   s    
zTestFindPackages._mkdirc                 C   s$   |rt j||}t|d  |S )Nwb)r   r    r!   openclose)r   r    dir_r   r   r   r   :   s    zTestFindPackages._touchc                 C   s,   |  d| j t| j}|ddgks(td S )Nr   r   
pkg.subpkgr   r   r   r   AssertionErrorr   packagesr   r   r   test_regular_package@   s    
z%TestFindPackages.test_regular_packagec                 C   s.   |  d| j t| jdd}|dgks*td S )Nr   )zpkg.*excluder   r)   r+   r   r   r   test_excludeE   s    zTestFindPackages.test_excludec                 C   s<   |  d| j |  d| j t| jdd}|dgks8tdS )zW
        Excluding a parent package should not exclude child packages as well.
        r   )r   r.   r(   N)r   r   r   r   r   r*   r+   r   r   r   test_exclude_recursiveJ   s    z'TestFindPackages.test_exclude_recursivec                 C   sJ   |  d| j | d| j}|  d| t| jdgd}|dgksFtdS )zM
        If include is specified, other packages should be excluded.
        r   Z	other_pkg)includeN)r   r   r   r   r   r*   )r   Zalt_dirr,   r   r   r   test_include_excludes_otherS   s
    z,TestFindPackages.test_include_excludes_otherc                 C   sV   t tj| jd | d| j}| d| | d| t	| j}d|ksRt
d S )Npkg/subpkg/assetsz	some.datar   zfile.datzpkg.some.data)r   r   r   r    r!   r   r   r   r   r   r*   )r   data_dirr,   r   r   r   test_dir_with_dot_is_skipped]   s    
z-TestFindPackages.test_dir_with_dot_is_skippedc                 C   s@   |  d| j}|  d|}| d| t| j}d|ks<tdS )zk
        Ensure that a package in a non-package such as build/pkg/__init__.py
        is excluded.
        buildr   r   z	build.pkgN)r   r   r   r   r*   )r   	build_dirZbuild_pkg_dirr,   r   r   r   ,test_dir_with_packages_in_subdir_is_excludede   s
    
z=TestFindPackages.test_dir_with_packages_in_subdir_is_excludedzSymlink support required)reasonc                 C   sT   |  d| j tj| jd}td| tj|s:tt	| j}d|ksPtdS )z
        A symbolically-linked directory should be treated like any other
        directory when matched as a package.

        Create a link from lpkg -> pkg.
        r   Zlpkgr   N)
r   r   r   r    r!   r   symlinkisdirr*   r   )r   Z
linked_pkgr,   r   r   r   $test_symlinked_packages_are_includedp   s    
z5TestFindPackages.test_symlinked_packages_are_includedc                 C   s   t |t |kstd S r   )setr*   )r   actualexpectedr   r   r   _assert_packages   s    z!TestFindPackages._assert_packagesc                 C   s*   t | jdgdgd}| |dddg d S )Nzpkg*pkg.subpkg.assets)r2   r/   r   	pkg.nspkgr(   r   r   rA   r+   r   r   r   test_pep420_ns_package   s      z'TestFindPackages.test_pep420_ns_packagec                 C   s(   t | jdgd}| |ddddg d S )NrB   r.   r   r   rC   r(   rD   r+   r   r   r   "test_pep420_ns_package_no_includes   s    z3TestFindPackages.test_pep420_ns_package_no_includesc                 C   s(   t | j}dddddg}| || d S )Nr   r   rC   r(   rB   rD   )r   r,   r@   r   r   r   .test_pep420_ns_package_no_includes_or_excludes   s    
z?TestFindPackages.test_pep420_ns_package_no_includes_or_excludesc                 C   s6   |  d| j t| jddgd}| |dddg d S )Nr   r   rB   r.   r   rC   r(   )r   r   r   r   rA   r+   r   r   r   3test_regular_package_with_nested_pep420_ns_packages   s     zDTestFindPackages.test_regular_package_with_nested_pep420_ns_packagesc                 C   sB   t | j t tj| jd t| j}| |dddg d S )Nr4   r   rC   r(   )	r   r   r   r   r    r!   r   r   rA   r+   r   r   r   *test_pep420_ns_package_no_non_package_dirs   s    
z;TestFindPackages.test_pep420_ns_package_no_non_package_dirs)N)N)__name__
__module____qualname__r   r   r   r   r   r-   r0   r1   r3   r6   r9   pytestmarkZskipifr   Zcan_symlinkr=   rA   rE   rF   rG   rH   rI   r   r   r   r   r      s&   

	

r   c                   @   s   e Zd Zdddgddgfddgddgfd	d
dgg fdddgdgfdddgdgfddddddgdddgfddddddddgdddgfd Zejd!e d"d# Zd$S )%TestFlatLayoutPackageFinderz.pkg/__init__.pyzpkg/__init__.pyzpkg/nested/file.txtr   z
pkg.nestedz_pkg/__init__.pyzpkg/_private/__init__.pyzpkg._privatezinvalid-pkg/__init__.pyzother.pkg/__init__.pyzyet,another/file.pyzdocs/conf.pyzdocs/readme.rstztests/test_pkg.pyztests/__init__.pyzexamples/__init__.pyzexamples/file.pyzexample/other_file.pyzpkg/example/__init__.pyzpkg/examples/__init__.pyzpkg.exampleszpkg.examplezhtmlcov/index.htmlztasks/__init__.pyztasks/subpackage/__init__.pyzfabfile/__init__.pyzfabfile/subpackage/__init__.pyzpkg/tasks/__init__.pyzpkg/fabfile/__init__.pyz	pkg.taskszpkg.fabfile)zhidden-folderszprivate-packageszinvalid-namer   testsZexamplesztool-specificexamplec                 C   s>   | j | \}}t|| tt|}t|t|ks:td S r   )EXAMPLESensure_filesr   findstrr>   r*   )r   Ztmp_pathrQ   filesZexpected_packagesZfound_packagesr   r   r   &test_unwanted_directories_not_included   s    
zBTestFlatLayoutPackageFinder.test_unwanted_directories_not_includedN)	rJ   rK   rL   rR   rM   rN   ZparametrizekeysrW   r   r   r   r   rO      sH   	.rO   c                 C   s.   |D ]$}| | }|j jddd |  qd S )NT)parentsexist_ok)parentr"   touch)	root_pathrV   filer    r   r   r   rS      s    rS   )__doc__r   r   r	   rM   
setuptoolsr   r   Zsetuptools.discoveryr   Zcompat.py39r   r   rO   rS   r   r   r   r   <module>   s    7