a
    äzeóZ  ã                   @   sê   d dl mZ d dlmZmZmZ d dlZd dlZd dlZ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ZG dd„ dejƒZG dd„ dejƒZG d	d
„ d
ejƒZG dd„ dejƒZG dd„ dejƒZdd„ Zedkræe ¡  dS )é    )ÚPath)ÚunloadÚcheck_warningsÚCleanImportN)Úspec_from_file_locationc                   @   s\   e 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S )ÚPkgutilTestsc                 C   s.   t  ¡ | _|  tj| j¡ tj d| j¡ d S ©Nr   )	ÚtempfileÚmkdtempÚdirnameÚ
addCleanupÚshutilÚrmtreeÚsysÚpathÚinsert©Úself© r   ú'/usr/lib/python3.9/test/test_pkgutil.pyÚsetUp   s    
zPkgutilTests.setUpc                 C   s   t jd= d S r   )r   r   r   r   r   r   ÚtearDown   s    zPkgutilTests.tearDownc                 C   sÜ   d}d}t j | j|¡}t  |¡ tt j |d¡dƒ}| ¡  tt j |d¡dƒ}| |¡ | ¡  t  t j |d¡¡ tt j |dd¡dƒ}| |¡ | ¡  t 	|d¡}|  
||¡ t 	|d¡}|  
||¡ tj|= d S )NÚtest_getdata_filesysó%   Hello, world!
Second line
Third lineú__init__.pyÚwbúres.txtÚsubúsub/res.txt)Úosr   Újoinr   ÚmkdirÚopenÚcloseÚwriteÚpkgutilÚget_dataÚassertEqualr   Úmodules)r   ÚpkgÚRESOURCE_DATAZpackage_dirÚfÚres1Úres2r   r   r   r      s$    


z!PkgutilTests.test_getdata_filesysc           
      C   sð   d}d}d}t j | j|¡}t |d¡}| |d d¡ | |d |¡ | |d |¡ | ¡  tj 	d	|¡ t
 |d
¡}|  ||¡ t
 |d¡}|  ||¡ g }t
 |g¡D ]}	|  |	t
j¡ | |	j¡ q®|  |dg¡ tjd	= tj|= d S )Nútest_getdata_zipfile.zipÚtest_getdata_zipfiler   Úwú/__init__.pyÚ ú/res.txtz/sub/res.txtr   r   r   )r   r   r    r   ÚzipfileÚZipFileÚwritestrr#   r   r   r%   r&   r'   Úiter_modulesÚassertIsInstanceÚ
ModuleInfoÚappendÚnamer(   )
r   Úzipr)   r*   Úzip_fileÚzr,   r-   ÚnamesÚ
moduleinfor   r   r   r/   ;   s*    z!PkgutilTests.test_getdata_zipfilec           
   
   C   s0  d}d}d}t j | j|¡}t |d¡}| |d d¡ | |d |¡ | ¡  tj 	d|¡ ztt
 |d	¡}|  ||¡ g }t
 t|ƒg¡D ]}|  |t
j¡ | |j¡ qŒ|  ||g¡ W tjd= tj |d ¡ ntjd= tj |d ¡ 0 d
}	|  t|	¡ tt
 d¡ƒ W d   ƒ n1 s"0    Y  d S )Nr.   r/   r   r0   r1   r2   r3   r   r   z9path must be None or list of paths to look for modules inZinvalid_path)r   r   r    r   r4   r5   r6   r#   r   r   r%   r&   r'   r7   r   r8   r9   r:   r;   r(   ÚpopZassertRaisesRegexÚ
ValueErrorÚlist)
r   r<   r)   r*   r=   r>   Úresr?   r@   Zexpected_msgr   r   r   Útest_issue44061_iter_modules^   s0    ÿz)PkgutilTests.test_issue44061_iter_modulesc                 C   sR   d}t j | j|¡}t  |d¡ |  t j|¡ tj| jgdD ]}|  	d¡ q>d S )NZunreadable_packager   )r   zunexpected package found)
r   r   r    r   r!   r   Úrmdirr%   Úwalk_packagesÚfail)r   Zpackage_nameÚdÚtr   r   r   Útest_unreadable_dir_on_syspath…   s    z+PkgutilTests.test_unreadable_dir_on_syspathc           	      C   sh  d}t j | j|¡}t  |¡ tt j |d¡dƒ}| ¡  t  t j |d¡¡ tt j |dd¡dƒ}| ¡  tt j |dd¡dƒ}| ¡  d}t j | j|¡}t  |¡ tt j |d¡dƒ}| ¡  t  t j |d¡¡ tt j |dd¡dƒ}| ¡  tt j |dd¡dƒ}| ¡  g d¢}dd„ t | jg¡D ƒ}|  	||¡ |D ]}| 
d	¡rXqDtj|= qDd S )
NÚtest_walkpackages_filesysr   r   r   zmod.py)r   zsub.test_walkpackages_filesysz!sub.test_walkpackages_filesys.modrL   ztest_walkpackages_filesys.subz!test_walkpackages_filesys.sub.modc                 S   s   g | ]}|d  ‘qS ©é   r   ©Ú.0Úer   r   r   Ú
<listcomp>°   ó    z:PkgutilTests.test_walkpackages_filesys.<locals>.<listcomp>Úmod)r   r   r    r   r!   r"   r#   r%   rG   r'   Úendswithr   r(   )	r   Úpkg1Zpkg1_dirr+   Úpkg2Zpkg2_dirÚexpectedÚactualr)   r   r   r   rL      s6    

z&PkgutilTests.test_walkpackages_filesysc           	      C   s  d}d}d}t j | j|¡}t |d¡}| |d d¡ | |d | d d¡ | |d | d d¡ | |d d¡ | |d | d d¡ | |d | d d¡ | ¡  tj 	d	|¡ g d
¢}dd„ t
 |g¡D ƒ}|  ||¡ tjd	= |D ]}| d¡rqôtj|= qôd S )Nztest_walkpackages_zipfile.zipÚtest_walkpackages_zipfiler   r0   r1   r2   ú/z/mod.pyr   )r   zsub.test_walkpackages_zipfilez!sub.test_walkpackages_zipfile.modrZ   ztest_walkpackages_zipfile.subz!test_walkpackages_zipfile.sub.modc                 S   s   g | ]}|d  ‘qS rM   r   rO   r   r   r   rR   Ò   rS   z:PkgutilTests.test_walkpackages_zipfile.<locals>.<listcomp>rT   )r   r   r    r   r4   r5   r6   r#   r   r   r%   rG   r'   rU   r(   )	r   r<   rV   rW   r=   r>   rX   rY   r)   r   r   r   rZ   ¸   s*    z&PkgutilTests.test_walkpackages_zipfilec                 C   s„   d}|   ttf¡ tt |¡ƒ W d   ƒ n1 s60    Y  d}|   ttf¡ tt |¡ƒ W d   ƒ n1 sv0    Y  d S )NZtest_dirs   test_dir)ÚassertRaisesÚ	TypeErrorrB   rC   r%   rG   )r   Ú	str_inputZbytes_inputr   r   r   Ú2test_walk_packages_raises_on_string_or_bytes_inputÛ   s    ,z?PkgutilTests.test_walk_packages_raises_on_string_or_bytes_inputc                 C   sÆ  dd l }dd l}dtfdtjfdtjjfd|fd|fd|jfd|jfd	|jjfd
|jjfd|jjjfd|jjjfdtfdtfdtj	fdtj	fdt
fdt
fdtjff}d tfdtfdtfdtfdtfdtfdtfdtfdtfdtfdtfdtfdtfd tfd!tfd"tfd#tff}d$}|D ]Ô}tj | j|¡}ztj|dd% W n tyV   Y qY n0 tj |d&¡}t|d'ƒ"}| d¡ | ¡  W d   ƒ n1 sš0    Y  t ¡  t |¡}|||ff7 }t|ƒdkr||d d(… tff7 }q|d)tff7 }|D ]N\}	}
| j|	d*& t |	¡}|  ||
¡ W d   ƒ n1 s@0    Y  qþ|D ]n\}	}| j|	d*F |  |¡ t |	¡ W d   ƒ n1 s”0    Y  W d   ƒ n1 s´0    Y  qRd S )+Nr   r   zos.pathzos.path:pathsepÚloggingzlogging:zlogging.handlerszlogging.handlers:zlogging.handlers:SysLogHandlerzlogging.handlers.SysLogHandlerz(logging.handlers:SysLogHandler.LOG_ALERTz(logging.handlers.SysLogHandler.LOG_ALERTzbuiltins.intzbuiltins:intzbuiltins.int.from_byteszbuiltins:int.from_byteszbuiltins.ZeroDivisionErrorzbuiltins:ZeroDivisionErrorzos:pathrN   g       @Tr2   z?abczabc/fooÚfoozos.foozos.foo:zos.pth:pathsepzlogging.handlers:NoSuchHandlerz,logging.handlers:SysLogHandler.NO_SUCH_VALUEz,logging.handlers.SysLogHandler.NO_SUCH_VALUEÚZeroDivisionErrorzos.path.9abcZ9abc)	u	   à¤µà¤®à¤¸õ   Ã©õ   Ãˆu   ì•ˆë…•í•˜ì„¸ìš”u   ã•ã‚ˆãªã‚‰u   ã‚ã‚ŠãŒã¨ã†u   Ð¥Ð¾Ñ€Ð¾ÑˆÐ¾u   ÑÐ¿Ð°ÑÐ¸Ð±Ð¾u   çŽ°ä»£æ±‰è¯­å¸¸ç”¨å­—è¡¨©Úexist_okr   r0   éÿÿÿÿu   à¥¦à¤µà¤®à¤¸)Ús)r`   Zlogging.handlersr   r   ÚpathsepÚhandlersZSysLogHandlerZ	LOG_ALERTÚintÚ
from_bytesrb   r]   rB   ÚImportErrorÚAttributeErrorr    r   ÚmakedirsÚUnicodeEncodeErrorr"   r$   ÚflushÚ	importlibÚinvalidate_cachesÚimport_moduleÚlenZsubTestr%   Úresolve_namer'   r\   )r   r`   Zsuccess_casesZfailure_casesZunicode_wordsZuwrI   r+   rT   rh   rX   ÚoÚexcr   r   r   Útest_name_resolutionå   sˆ    


ÿÿìï	
(

0z!PkgutilTests.test_name_resolutionN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r/   rE   rK   rL   rZ   r_   ry   r   r   r   r   r      s   #'(#
r   c                   @   sL   e Zd ZG dd„ deƒZG dd„ deƒZdd„ Zdd„ Zd	d
„ Zdd„ Z	dS )ÚPkgutilPEP302Testsc                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )zPkgutilPEP302Tests.MyTestLoaderc                 C   s   d S ©Nr   )r   Úspecr   r   r   Úcreate_moduleD  s    z-PkgutilPEP302Tests.MyTestLoader.create_modulec                 C   s   |j  dd¡d |j d< d S )NÚloadsr   rN   )Ú__dict__Úget)r   rT   r   r   r   Úexec_moduleG  s    z+PkgutilPEP302Tests.MyTestLoader.exec_modulec                 C   s   dS )NúHello, world!r   )r   r   r   r   r   r&   K  s    z(PkgutilPEP302Tests.MyTestLoader.get_dataN)rz   r{   r|   r€   r„   r&   r   r   r   r   ÚMyTestLoaderC  s   r†   c                   @   s   e Zd Zddd„ZdS )z!PkgutilPEP302Tests.MyTestImporterNc                 C   s    t  ¡ }t|d|jj |g dS )Nz<%s>)ÚloaderÚsubmodule_search_locations)r}   r†   r   Ú	__class__rz   )r   Úfullnamer   Útargetr‡   r   r   r   Ú	find_specO  s    
ýz+PkgutilPEP302Tests.MyTestImporter.find_spec)NN)rz   r{   r|   rŒ   r   r   r   r   ÚMyTestImporterN  s   r   c                 C   s   t j d|  ¡ ¡ d S r   )r   Ú	meta_pathr   r   r   r   r   r   r   V  s    zPkgutilPEP302Tests.setUpc                 C   s   t jd= d S r   )r   rŽ   r   r   r   r   r   Y  s    zPkgutilPEP302Tests.tearDownc                 C   s    |   t dd¡d¡ tjd= d S )Nra   Údummyr…   )r'   r%   r&   r   r(   r   r   r   r   Útest_getdata_pep302\  s    z&PkgutilPEP302Tests.test_getdata_pep302c                 C   sD   dd l }|  |jd¡ |  t dd¡d¡ |  |jd¡ tjd= d S )Nr   rN   ra   r   r…   )ra   r'   r   r%   r&   r   r(   )r   ra   r   r   r   Útest_alreadyloadeda  s
    z%PkgutilPEP302Tests.test_alreadyloadedN)
rz   r{   r|   Úobjectr†   r   r   r   r   r‘   r   r   r   r   r}   A  s   r}   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚExtendPathTestsc                 C   sp   t  ¡ }tj d|¡ tj ||¡}t |¡ ttj |d¡dƒ}| 	d¡ W d   ƒ n1 sb0    Y  |S )Nr   r   r0   zKfrom pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
)
r	   r
   r   r   r   r   r    r!   r"   r$   )r   Úpkgnamer   ZpkgdirÚflr   r   r   Úcreate_inito  s    
(zExtendPathTests.create_initc                 C   sT   t j |||d ¡}t|dƒ"}td |¡|d W d   ƒ n1 sF0    Y  d S )Nú.pyr0   zvalue={})Úfile)r   r   r    r"   ÚprintÚformat)r   r   r”   Zsubmodule_nameÚvalueÚmodule_namer•   r   r   r   Úcreate_submodulez  s    z ExtendPathTests.create_submodulec              	   C   sÖ   d}|   |¡}|   |¡}|  ||dd¡ |  ||dd¡ dd l}dd l}|  |jjd¡ |  |jjd¡ |  t|j	ƒtt
j ||¡t
j ||¡gƒ¡ t |¡ t |¡ tjd= tjd= tjd= tjd= tjd= d S )Nra   Úbarr   ÚbazrN   úfoo.barúfoo.baz)r–   r   Úfoo.barÚfoo.bazr'   rž   r›   rŸ   ÚsortedÚ__path__r   r   r    r   r   r   r(   ©r   r”   Z	dirname_0Z	dirname_1ra   r   r   r   Útest_simple  s*    

ÿÿ

zExtendPathTests.test_simplec                 C   sð  t j}t j}d}d}|  |¡}tj ||¡}d ||¡}tj	 
|d ¡ tj	 
|d ¡ zV|  |||d¡ t |¡ t||ƒƒ}||ƒ}	|D ]r}
t  |
|¡}|j}z
|j}W n ty¼   Y n0 |  |
tjj¡ |  |
|	¡ |  |tjj¡ |  t  |
|¡¡ qŠ|  t¡ t|dƒƒ W d   ƒ n1 s,0    Y  |  t¡ t|dƒƒ W d   ƒ n1 sd0    Y  W t |¡ tjd= ztj	d= tj	d= W n tyª   Y n0 n>t |¡ tjd= ztj	d= tj	d= W n tyè   Y n0 0 d S )NÚspamZeggsz{}.{}r   zinvalid.modulez.spamz	spam.eggs)r%   Úiter_importersÚget_importerr–   r   r   r    rš   r   r(   rA   r   rr   rt   rC   Ú	_get_specr‡   rn   r8   Ú	machineryÚ
FileFinderr'   ÚSourceFileLoaderÚassertIsNoner\   rm   r   r   ÚKeyError)r   r©   rª   r”   Úmodnamer   ZpathitemrŠ   Z	importersZexpected_importerÚfinderr   r‡   r   r   r   Útest_iter_importersœ  sZ    


ÿ,.
ú
z#ExtendPathTests.test_iter_importersc              	   C   sì   d}|   |¡}|   |¡}|  ||dd¡ t tj ||d¡¡ |  ||dd¡ dd l}dd l}|  |j	j
d¡ |  |jj
d¡ |  t|jƒttj ||¡tj ||¡gƒ¡ t |¡ t |¡ tjd= tjd= tjd= tjd= tjd= d S )	Nra   rž   r   r   rŸ   rN   r    r¡   )r–   r   r   Úunlinkr   r    r¢   r£   r'   rž   r›   rŸ   r¤   r¥   r   r   r   r(   r¦   r   r   r   Útest_mixed_namespaceÌ  s,    

ÿÿ

z$ExtendPathTests.test_mixed_namespaceN)rz   r{   r|   r–   r   r§   r³   rµ   r   r   r   r   r“   n  s
   0r“   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚNestedNamespacePackageTestc                 C   s   t  ¡ | _tjd d … | _d S r~   )r	   r
   Úbasedirr   r   Úold_pathr   r   r   r   r   í  s    
z NestedNamespacePackageTest.setUpc                 C   s    | j tjd d …< t | j¡ d S r~   )r¸   r   r   r   r   r·   r   r   r   r   r   ñ  s    z#NestedNamespacePackageTest.tearDownc                 C   s€   |  dd¡\}}tj | j| dtjj¡¡}tj|dd ttj ||d ¡dƒ}| 	|¡ W d   ƒ n1 sr0    Y  d S )NÚ.rN   Tre   r—   r0   )
Úrsplitr   r   r    r·   ÚreplaceÚsepro   r"   r$   )r   r;   ÚcontentsÚbaseÚfinalÚ	base_pathr+   r   r   r   r€   õ  s
    z(NestedNamespacePackageTest.create_modulec                 C   s  d}|   d|¡ |   d|¡ |   d|¡ |   d|¡ |   dd¡ |   dd	¡ tj d
tj | jd¡¡ tj d
tj | jd¡¡ d
d l}|  t	d¡ |  
t|jƒd¡ d
d l}|  t	d¡ |  
t|jjƒd¡ d
dlm} d
dlm} |  
|d¡ |  
|d¡ d S )NzBimport pkgutil; __path__ = pkgutil.extend_path(__path__, __name__)za.pkg.__init__zb.pkg.__init__za.pkg.subpkg.__init__zb.pkg.subpkg.__init__za.pkg.subpkg.czc = 1zb.pkg.subpkg.dzd = 2r   ÚaÚbr)   é   z
pkg.subpkg)Úc)rI   rN   )r€   r   r   r   r   r    r·   r)   r   r   r'   ru   r¥   Z
pkg.subpkgZsubpkgZpkg.subpkg.crÄ   Zpkg.subpkg.drI   )r   Zpkgutil_boilerplater)   rÄ   rI   r   r   r   Útest_nestedü  s(    ÿz&NestedNamespacePackageTest.test_nestedN)rz   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d„ Ze e d	k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 )ÚImportlibMigrationTestsc                 C   s   t dtfƒS )Nz5This emulation is deprecated, use 'importlib' instead)r   ÚDeprecationWarningr   r   r   r   Úcheck_deprecated  s
    ÿÿz(ImportlibMigrationTests.check_deprecatedc                 C   s6   |   ¡  t d¡ W d   ƒ n1 s(0    Y  d S ©Nr2   )rÈ   r%   ZImpImporterr   r   r   r   Útest_importer_deprecated  s    
z0ImportlibMigrationTests.test_importer_deprecatedc                 C   s<   |   ¡   t dddd¡ W d   ƒ n1 s.0    Y  d S rÉ   )rÈ   r%   Z	ImpLoaderr   r   r   r   Útest_loader_deprecated"  s    
z.ImportlibMigrationTests.test_loader_deprecatedc                 C   sl   t ƒ R}|  t d¡¡ |  t d¡¡ |  t d¡¡ |  t|jƒd¡ W d   ƒ n1 s^0    Y  d S ©Nr   r   ztest.supportr   )r   ÚassertIsNotNoner%   Ú
get_loaderr'   ru   Úwarnings©r   r0   r   r   r   Ú test_get_loader_avoids_emulation&  s
    z8ImportlibMigrationTests.test_get_loader_avoids_emulationÚ__main__znot compatible with __main__c                 C   sb   t }b zPtƒ 2}|  t t¡¡ |  t|jƒd¡ W d   ƒ n1 sF0    Y  W |a n|a 0 d S r   )	Ú
__loader__r   rÍ   r%   rÎ   rz   r'   ru   rÏ   )r   Zthis_loaderr0   r   r   r   Ú0test_get_loader_handles_missing_loader_attribute-  s    2zHImportlibMigrationTests.test_get_loader_handles_missing_loader_attributec                 C   s^   d}t tƒ|ƒ}|`t|ƒ$ |tj|< t |¡}W d   ƒ n1 sF0    Y  |  |¡ d S ©Nr¨   ©Útyper   Ú__spec__r   r(   r%   rÎ   r¯   ©r   r;   rT   r‡   r   r   r   Ú.test_get_loader_handles_missing_spec_attribute9  s    

(zFImportlibMigrationTests.test_get_loader_handles_missing_spec_attributec                 C   s`   d}t tƒ|ƒ}d |_t|ƒ$ |tj|< t |¡}W d   ƒ n1 sH0    Y  |  |¡ d S rÕ   rÖ   rÙ   r   r   r   Ú+test_get_loader_handles_spec_attribute_noneB  s    

(zCImportlibMigrationTests.test_get_loader_handles_spec_attribute_nonec                 C   s>   d}d t j|< zt |¡}W t j|= n
t j|= 0 |  |¡ d S ©Nztotally bogus)r   r(   r%   rÎ   r¯   ©r   r;   r‡   r   r   r   Ú#test_get_loader_None_in_sys_modulesK  s    
z;ImportlibMigrationTests.test_get_loader_None_in_sys_modulesc                 C   s   d}t  |¡}|  |¡ d S rÜ   )r%   Úfind_loaderr¯   rÝ   r   r   r   Útest_find_loader_missing_moduleT  s    
z7ImportlibMigrationTests.test_find_loader_missing_modulec                 C   sl   t ƒ R}|  t d¡¡ |  t d¡¡ |  t d¡¡ |  t|jƒd¡ W d   ƒ n1 s^0    Y  d S rÌ   )r   rÍ   r%   rß   r'   ru   rÏ   rÐ   r   r   r   Ú!test_find_loader_avoids_emulationY  s
    z9ImportlibMigrationTests.test_find_loader_avoids_emulationc                 C   sL   t ƒ 2}|  t d¡¡ |  t|jƒd¡ W d   ƒ n1 s>0    Y  d S )Nz*??r   )r   r¯   r%   rª   r'   ru   rÏ   rÐ   r   r   r   Ú"test_get_importer_avoids_emulation`  s    z:ImportlibMigrationTests.test_get_importer_avoids_emulationc                 C   s4   zt  tdƒ¡ W n ty.   |  d¡ Y n0 d S )Nz/homez3Unexpected AttributeError when calling get_importer)r%   rª   r   rn   rH   r   r   r   r   Útest_issue44061f  s    z'ImportlibMigrationTests.test_issue44061c                 C   sJ   t ƒ 0}t ¡ D ]}q|  t|jƒd¡ W d   ƒ n1 s<0    Y  d S r   )r   r%   r©   r'   ru   rÏ   )r   r0   Zimporterr   r   r   Ú$test_iter_importers_avoids_emulationl  s    z<ImportlibMigrationTests.test_iter_importers_avoids_emulationN)rz   r{   r|   rÈ   rÊ   rË   rÑ   ÚunittestZskipIfrÔ   rÚ   rÛ   rÞ   rà   rá   râ   rã   rä   r   r   r   r   rÆ     s   
			rÆ   c                  C   s&   dd l } dd l}| j ¡  | ¡  d S r   )Ú	zipimportrr   Ú_zip_directory_cacheÚclearrs   )ræ   rr   r   r   r   ÚtearDownModuler  s    
ré   rÒ   )Úpathlibr   Ztest.supportr   r   r   rå   r   rr   Úimportlib.utilr   r%   r   Zos.pathr	   r   r4   ZTestCaser   r}   r“   r¶   rÆ   ré   rz   Úmainr   r   r   r   Ú<module>   s*     /-})^