o
    5h                     @   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)tempfileZmkdtempdist_dir_make_pkg_structureselfmethod r   Clib/python3.10/site-packages/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   Z
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   Zdir_r   r   r   r   :   s   zTestFindPackages._touchc                 C   s,   |  d| j t| j}|ddgksJ d S )Nr   r   
pkg.subpkgr   r   r   r
   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J 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sJ 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   test_exclude_recursiveJ   s   z'TestFindPackages.test_exclude_recursivec                 C   sJ   |  d| j | d| j}|  d| t| jdgd}|dgks#J dS )zM
        If include is specified, other packages should be excluded.
        r   Z	other_pkg)includeN)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|vs)J 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   Z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|vsJ dS )zk
        Ensure that a package in a non-package such as build/pkg/__init__.py
        is excluded.
        Zbuildr   r   z	build.pkgN)r   r
   r   r   )r   Z	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J t| j}d|v s(J 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   Z
linked_pkgr(   r   r   r   $test_symlinked_packages_are_includedp   s   
z5TestFindPackages.test_symlinked_packages_are_includedc                 C   s   t |t |ks
J d S r   )set)r   actualexpectedr   r   r   _assert_packages   s   z!TestFindPackages._assert_packagesc                 C   s(   t | jdgdgd}| |g d d S )Nzpkg*pkg.subpkg.assets)r.   r+   r   	pkg.nspkgr%   r   r
   r:   r'   r   r   r   test_pep420_ns_package   s   z'TestFindPackages.test_pep420_ns_packagec                 C   s$   t | jdgd}| |g d d S )Nr;   r*   )r   r   r=   r%   r>   r'   r   r   r   "test_pep420_ns_package_no_includes   s   z3TestFindPackages.test_pep420_ns_package_no_includesc                 C   s"   t | j}g d}| || d S )N)r   r   r=   r%   r;   r>   )r   r(   r9   r   r   r   .test_pep420_ns_package_no_includes_or_excludes   s   
z?TestFindPackages.test_pep420_ns_package_no_includes_or_excludesc                 C   s4   |  d| j t| jddgd}| |g d d S )Nr   r   r;   r*   r<   )r   r   r   r
   r:   r'   r   r   r   3test_regular_package_with_nested_pep420_ns_packages   s
   
zDTestFindPackages.test_regular_package_with_nested_pep420_ns_packagesc                 C   s@   t | j t tj| jd t| j}| |g d d S )Nr0   r<   )	r   r   r   r   r   r    r
   r   r:   r'   r   r   r   *test_pep420_ns_package_no_non_package_dirs   s   
z;TestFindPackages.test_pep420_ns_package_no_non_package_dirsr   )__name__
__module____qualname__r   r   r   r   r   r)   r,   r-   r/   r1   r2   pytestmarkZskipifr   Zcan_symlinkr6   r:   r?   r@   rA   rB   rC   r   r   r   r   r      s(    

	

r   c                	   @   s   e Zd Zg dddgfddgddgfg dg fg ddgfg d	dgfg d
g dfg dg dfdZejde dd ZdS )TestFlatLayoutPackageFinder)z.pkg/__init__.pypkg/__init__.pyzpkg/nested/file.txtr   z
pkg.nestedz_pkg/__init__.pyzpkg/_private/__init__.pyzpkg._private)zinvalid-pkg/__init__.pyzother.pkg/__init__.pyzyet,another/file.py)rJ   zdocs/conf.pyzdocs/readme.rst)rJ   ztests/test_pkg.pyztests/__init__.py)rJ   zexamples/__init__.pyzexamples/file.pyzexample/other_file.pyzpkg/example/__init__.pyzpkg/examples/__init__.py)r   zpkg.exampleszpkg.example)zhtmlcov/index.htmlrJ   ztasks/__init__.pyztasks/subpackage/__init__.pyzfabfile/__init__.pyzfabfile/subpackage/__init__.pyzpkg/tasks/__init__.pyzpkg/fabfile/__init__.py)r   z	pkg.taskszpkg.fabfile)zhidden-folderszprivate-packageszinvalid-namer   ZtestsZexamplesztool-specificexamplec                 C   s>   | j | \}}t|| tt|}t|t|ksJ d S r   )EXAMPLESensure_filesr   findstrr7   )r   Ztmp_pathrK   filesZexpected_packagesZfound_packagesr   r   r   &test_unwanted_directories_not_included   s   
zBTestFlatLayoutPackageFinder.test_unwanted_directories_not_includedN)	rD   rE   rF   rL   rG   rH   ZparametrizekeysrQ   r   r   r   r   rI      s.    	.rI   c                 C   s.   |D ]}| | }|j jddd |  qd S )NT)parentsexist_ok)parentr!   touch)Z	root_pathrP   filer   r   r   r   rM      s
   
rM   )__doc__r   r   r	   rG   Z
setuptoolsr   r   Zsetuptools.discoveryr   Zcompat.py39r   r   rI   rM   r   r   r   r   <module>   s     7