
    0hh0                        S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKJ	r	  S SK
r
S/ SQS/S/S/rS/ SQS/S/S	/rS/ S
QSS// S/rS/ SQSS// S/rS/ SQ/ / S/rS/ SQ/ / S/rSSS/S// S/rSSS// / S/rSS// / S/rS/ SQS// S/rS/ SQS// S/rSSS// / S /rSSS// / S!/rS"S"S// / S#S$R1                  S%5      -   /rS& rS' r " S( S)\R8                  5      r\S*:X  a  \R>                  " 5         gg)+    N)supporta.module)ar   sysbczb.somethingza/__init__.py
a/module.py
                                from b import something
                                from c import something
b/__init__.py
                                from sys import *
)r   r   r   r   
__future__a  a/__init__.py
a/module.py
                                from b import something
                                from c import something
b/__init__.py
                                from __future__ import absolute_import
                                from sys import *
)r   a.bza.cr   mymoduler   blahblaha  mymodule.py
a/__init__.py
                                import blahblah
                                from a import b
                                import c
a/module.py
                                import sys
                                from a import b as x
                                from a.c import sillyname
a/b.py
a/c.py
                                from a.module import x
                                import mymodule as sillyname
                                from sys import version_info
)	r   r   r   zb.xzb.yzb.zr	   r   gczaj  mymodule.py
a/__init__.py
a/module.py
                                from __future__ import absolute_import
                                import sys # sys
                                import blahblah # fails
                                import gc # gc
                                import b.x # b.x
                                from b import y # b.y
                                from b.z import * # b.z.*
a/gc.py
a/sys.py
                                import mymodule
a/b/__init__.py
a/b/x.py
a/b/y.py
a/b/z.py
b/__init__.py
                                import z
b/unused.py
b/x.py
b/y.py
b/z.py
)r	   r   r   r
   a.b.ya.b.za.b.ca.b.c.moduleCa.b.c.da.b.c.ea.b.xr   a  mymodule.py
a/__init__.py
                                from .b import y, z # a.b.y, a.b.z
a/module.py
                                from __future__ import absolute_import # __future__
                                import gc # gc
a/gc.py
a/sys.py
a/b/__init__.py
                                from ..b import x # a.b.x
                                #from a.b.c import moduleC
                                from .c import moduleC # a.b.moduleC
a/b/x.py
a/b/y.py
a/b/z.py
a/b/g.py
a/b/c/__init__.py
                                from ..c import e # a.b.c.e
a/b/c/moduleC.py
                                from ..c import d # a.b.c.d
a/b/c/d.py
a/b/c/e.py
a/b/c/x.py
)r   r   za.sysr
   r   r   r   r   r   r   za.b.c.fr   z	a.anothera  mymodule.py
a/__init__.py
                                from . import sys # a.sys
a/another.py
a/module.py
                                from .b import y, z # a.b.y, a.b.z
a/gc.py
a/sys.py
a/b/__init__.py
                                from .c import moduleC # a.b.c.moduleC
                                from .c import d # a.b.c.d
a/b/x.py
a/b/y.py
a/b/z.py
a/b/c/__init__.py
                                from . import e # a.b.c.e
a/b/c/moduleC.py
                                #
                                from . import f   # a.b.c.f
                                from .. import x  # a.b.x
                                from ... import another # a.another
a/b/c/d.py
a/b/c/e.py
a/b/c/f.py
r   za.barza/__init__.py
                                def foo(): pass
a/module.py
                                from . import foo
                                from . import bar
zza/__init__.py
                                def foo(): pass
a/module.py
                                from . import *
 )r   r   r   zb.moduleza/__init__.py
a/module.py
                                import b.module
b/__init__.py
b/module.py
                                ?  # SyntaxError: invalid syntax
)r   r   r   zb.cza/__init__.py
a/module.py
                                import c
                                from b import c
b/__init__.py
b/c.py
a_utf8b_utf8u  a_utf8.py
                                # use the default of utf8
                                print('Unicode test A code point 2090 ₐ that is not valid in cp1252')
                                import b_utf8
b_utf8.py
                                # use the default of utf8
                                print('Unicode test B code point 2090 ₐ that is not valid in cp1252')
uz  a_utf8.py
                                # coding=utf8
                                print('Unicode test A code point 2090 ₐ that is not valid in cp1252')
                                import b_utf8
b_utf8.py
                                # use the default of utf8
                                print('Unicode test B code point 2090 ₐ that is not valid in cp1252')
a_cp1252s   a_cp1252.py
                                # coding=cp1252
                                # 0xe2 is not allowed in utf8
                                print('CP1252 test Pt')
                                import b_utf8
u   b_utf8.py
                                # use the default of utf8
                                print('Unicode test A code point 2090 ₐ that is not valid in cp1252')
utf-8c                     [         R                  R                  U 5      n [         R                  " U5        [        U S5      $ ! [         a)  nUR
                  [
        R                  :w  a  e  S nAN:S nAff = f)Nwb)ospathdirnamemakedirsOSErrorerrnoEEXISTopen)r   r   es      ?/opt/python-3.13.8/usr/lib/python3.13/test/test_modulefinder.py	open_filer'   "  s^    ggood#G
G d  77ell" #s   A 
A6A11A6c                 l   S n UR                  5        H  n[        U5      [        :w  a  UR                  S5      nUR	                  S5      (       d  UR	                  S5      (       a$  UR                  UR                  5       S-   5        Mw  U(       a  UR                  5         [        U5      [        :X  a  UR                  S5      n[        [        R                  R                  XR                  5       5      5      nM     U(       a  UR                  5         g g ! U(       a  UR                  5         f f = f)Nr          	   
)
splitlinestypebytesencode
startswithwritestripclosedecoder'   r   r   join)test_dirsourceofilines       r&   create_packager:   ,  s    
C%%'DDzU"{{7+t$$(>(>		$**,./IIK:&;;w/DXzz| DE ( IIK 3IIK s   C<D D3c                       \ rS rSrS rS rSS/ \R                  4S jrS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)ModuleFinderTesti>  c                     [         R                  " 5       U l        U R                  [        R                  R                  [         R                  5      /U l        g N)tempfilemkdtempr6   r   r   r   __file__	test_pathselfs    r&   setUpModuleFinderTest.setUp?  s5     ((*--9J9J)KL    c                 D    [         R                  " U R                  5        g r>   )shutilrmtreer6   rC   s    r&   tearDownModuleFinderTest.tearDownC  s    dmm$rG   Fr   c                    Uu  pgpn
[        U R                  U
5        U" U R                  UUS9nUR                  U5        U(       a  UR	                  5         [        [        U5      5      n[        UR                  5      nU R                  X5        UR                  5       u  pU R                  X5        U R                  X5        g )N)r   debugreplace_paths)
r:   r6   rB   import_hookreportsortedsetmodulesassertEqualany_missing_maybe)rD   inforQ   rN   rO   modulefinder_classimport_thisrT   missingmaybe_missingr7   mffoundbadmaybes                  r&   _do_testModuleFinderTest._do_testF  s    ?C<gft}}f-T^^56CE
{#IIK W&rzz"( ))+
&.rG   c                 .    U R                  [        5        g r>   )r`   package_testrC   s    r&   test_packageModuleFinderTest.test_packagea  s    l#rG   c                 .    U R                  [        5        g r>   )r`   
maybe_testrC   s    r&   
test_maybeModuleFinderTest.test_maybed  s    j!rG   c                 .    U R                  [        5        g r>   )r`   maybe_test_newrC   s    r&   test_maybe_newModuleFinderTest.test_maybe_newg  s    n%rG   c                 .    U R                  [        5        g r>   )r`   absolute_import_testrC   s    r&   test_absolute_imports&ModuleFinderTest.test_absolute_importsj      *+rG   c                 .    U R                  [        5        g r>   )r`   relative_import_testrC   s    r&   test_relative_imports&ModuleFinderTest.test_relative_importsm  rr   rG   c                 .    U R                  [        5        g r>   )r`   relative_import_test_2rC   s    r&   test_relative_imports_2(ModuleFinderTest.test_relative_imports_2p      ,-rG   c                 .    U R                  [        5        g r>   )r`   relative_import_test_3rC   s    r&   test_relative_imports_3(ModuleFinderTest.test_relative_imports_3s  r{   rG   c                 .    U R                  [        5        g r>   )r`   relative_import_test_4rC   s    r&   test_relative_imports_4(ModuleFinderTest.test_relative_imports_4v  r{   rG   c                 .    U R                  [        5        g r>   )r`   syntax_error_testrC   s    r&   test_syntax_error"ModuleFinderTest.test_syntax_errory  s    '(rG   c                 .    U R                  [        5        g r>   )r`   same_name_as_bad_testrC   s    r&   test_same_name_as_bad&ModuleFinderTest.test_same_name_as_bad|  s    +,rG   c                    [         R                  R                  U R                  S5      nU[        R
                  R                  S   -   nU[        R
                  R                  S   -   n[        U5       nUR                  SR                  S5      5        S S S 5        [        R                  " X#S9  [         R                  " U5        U R                  [        5        g ! , (       d  f       NN= f)Nr   r   ztesting_modulefinder = True
r   )cfile)r   r   r5   r6   	importlib	machinerySOURCE_SUFFIXESBYTECODE_SUFFIXESr'   r1   r/   
py_compilecompileremover`   bytecode_test)rD   	base_pathsource_pathbytecode_pathfiles        r&   test_bytecodeModuleFinderTest.test_bytecode  s    GGLL4	)"5"5"E"Ea"HH!I$7$7$I$I!$LL{#tJJ6==gFG $;<
		+m$	 $#s   6!C
C-c                    [         R                  R                  U R                  SS5      n[         R                  R                  U R                  SS5      n[        R
                  " 5        nU R                  [        SX4/S9  S S S 5        WR                  5       nSU< SU< 3nU R                  XC5        g ! , (       d  f       N:= f)Nr   z	module.pyzspam.py   )rN   rO   zco_filename z changed to )
r   r   r5   r6   r   captured_stdoutr`   rg   getvalueassertIn)rD   old_pathnew_pathoutputexpecteds        r&   test_replace_paths#ModuleFinderTest.test_replace_paths  s    77<<sK@77<<sI>$$&&MM*A*2)=(>  @ ' "5=xHh' '&s   ,B88
Cc           
      b    SSS// / S[        [        S5      5      -  /nU R                  U5        g )Nr   r   zVa.py
                                %r
                                import b
b.py
i   )listranger`   )rD   extended_opargs_tests     r&   test_extended_opargs%ModuleFinderTest.test_extended_opargs  s@    #J
 5<		  	*+rG   c                 .    U R                  [        5        g r>   )r`   coding_default_utf8_testrC   s    r&   test_coding_default_utf8)ModuleFinderTest.test_coding_default_utf8  s    ./rG   c                 .    U R                  [        5        g r>   )r`   coding_explicit_utf8_testrC   s    r&   test_coding_explicit_utf8*ModuleFinderTest.test_coding_explicit_utf8  s    /0rG   c                 .    U R                  [        5        g r>   )r`   coding_explicit_cp1252_testrC   s    r&   test_coding_explicit_cp1252,ModuleFinderTest.test_coding_explicit_cp1252  s    12rG   c                 ^     " S S[         R                  5      nU R                  [        US9  g )Nc                   4   ^  \ rS rSrU 4S jrU 4S jrSrU =r$ )AModuleFinderTest.test_load_module_api.<locals>.CheckLoadModuleApii  c                 &   > [         TU ]  " U0 UD6  g r>   )super__init__)rD   argskwds	__class__s      r&   r   JModuleFinderTest.test_load_module_api.<locals>.CheckLoadModuleApi.__init__  s     $/$/rG   c                 .   > Uu  pVn[         TU ]  XX45      $ r>   )r   load_module)	rD   fqnamefppathname	file_infosuffixmoder-   r   s	           r&   r   MModuleFinderTest.test_load_module_api.<locals>.CheckLoadModuleApi.load_module  s    %."dw*6xKKrG    )__name__
__module____qualname____firstlineno__r   r   __static_attributes____classcell__)r   s   @r&   CheckLoadModuleApir     s    0L LrG   r   )rX   )modulefinderModuleFinderr`   ro   )rD   r   s     r&   test_load_module_api%ModuleFinderTest.test_load_module_api  s*    	L!:!: 	L 	*?QRrG   )r6   rB   N)r   r   r   r   rE   rK   r   r   r`   rd   rh   rl   rp   ru   ry   r~   r   r   r   r   r   r   r   r   r   r   r   r   rG   r&   r<   r<   >  sz    M% %*"YeYrYr /6$"&,,...)-%(,013
SrG   r<   __main__) r   r"   importlib.machineryr   r   rI   unittestr?   testr   r   rg   rk   rc   ro   rt   rx   r}   r   r   r   r   r   r   r/   r   r'   r:   TestCaser<   r   mainr   rG   r&   <module>r      s   	        $ 
EM?
  EM?  6r	,   r B  " J  % P *I  *
  E L"	  !E2	  x	  x	   F7O
	  $uSx(( uSn zMMO rG   