
    F\h\                         S 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rSr	Sr
SrSrSrSrSr0 rS	 r0 rS
 rSS jr " S S5      r " S S5      rS r\S:X  a	   \" 5       rgg! \ a    \" S5         gf = f)z3Find modules used by a script, using introspection.    N                  c                 N    [         R                  U / 5      R                  U5        g N)packagePathMap
setdefaultappend)packagenamepaths     #/usr/lib/python3.13/modulefinder.pyAddPackagePathr      s    k2.55d;    c                     U[         U '   g r
   )replacePackageMap)oldnamenewnames     r   ReplacePackager   )   s    !(gr   c                 t   [         R                  R                  R                  5         [         R                  R                  R	                  X5      nUc  [        SR                  U S9U S9eUR                  [         R                  R                  L a  SSSS[        44$ UR                  [         R                  R                  L a  SSSS[        44$ UR                  nUR                  R                  U 5      (       a)  S[        R                  R!                  U5      SS["        44$ [%        UR                  [         R                  R&                  5      (       a  [(        nO[%        UR                  [         R                  R*                  [         R                  R,                  45      (       a  [.        nOF[%        UR                  [         R                  R0                  5      (       a  [2        nOSSSS[4        44$ [6        R8                  " U5      n[        R                  R;                  U5      S   nXSUSU44$ )zDAn importlib reimplementation of imp.find_module (for our purposes).NzNo module named {name!r})name rb)	importlib	machinery
PathFinderinvalidate_caches	find_specImportErrorformatloaderBuiltinImporter
_C_BUILTINFrozenImporter
_PY_FROZENorigin
is_packageosr   dirname_PKG_DIRECTORY
isinstanceSourceFileLoader
_PY_SOURCEExtensionFileLoaderAppleFrameworkLoader_C_EXTENSIONSourcelessFileLoader_PY_COMPILED_SEARCH_ERRORio	open_codesplitext)r   r   spec	file_pathkindfilesuffixs          r   _find_moduler?   -   s    ""446))33D?D|4;;;FTRR {{i))999TBJ///{{i))888TBJ///I{{d##RWW__Y/"b.1III$++y22CCDD	3344

 
 	DKK!4!4!I!I	J	J TBM222<<	"DWWi(,FVT4000r   c                   $    \ rS rSrSS jrS rSrg)Module_   Nc                 R    Xl         X l        X0l        S U l        0 U l        0 U l        g r
   )__name____file____path____code__globalnamesstarimports)selfr   r=   r   s       r   __init__Module.__init__a   s,      r   c                     SU R                   < 3nU R                  b  USU R                  < 3-   nU R                  b  USU R                  < 3-   nUS-   nU$ )NzModule(, ))rD   rE   rF   )rJ   ss     r   __repr__Module.__repr__n   sR    ==*==$dmm--A==$dmm--AGr   )rG   rE   rD   rF   rH   rI   )NN)rD   
__module____qualname____firstlineno__rK   rQ   __static_attributes__ r   r   rA   rA   _   s    r   rA   c                       \ rS rSrSS jrS rS rS rS rS r	SS	 jr
SS
 jrS rS rS S jrS rS rS rS rSS jrS rS rS rS rS!S jrS rS rS rS rSrg)"ModuleFinderw   Nc                     Uc  [         R                  nXl        0 U l        0 U l        X l        SU l        Ub  UO/ U l        Ub  UO/ U l        / U l        g )Nr   )	sysr   modules
badmodulesdebugindentexcludesreplace_pathsprocessed_paths)rJ   r   r_   ra   rb   s        r   rK   ModuleFinder.__init__y   sT    <88D	
$,$8b.;.G]R!r   c                     XR                   ::  aW  [        U R                  5       H  n[        SSS9  M     [        USS9  U H  n[        [	        U5      SS9  M     [        5         g g )N    end)r_   ranger`   printrepr)rJ   levelstrargsiargs         r   msgModuleFinder.msg   sU    JJ4;;'e% (#3d3iS) G r   c                 t    US   nX R                   ::  a$  U R                  S-   U l        U R                  " U6   g g Nr   r   r_   r`   rr   rJ   ro   rm   s      r   msginModuleFinder.msgin   4    QJJ++/DKHHdO r   c                 t    US   nX R                   ::  a$  U R                  S-
  U l        U R                  " U6   g g ru   rv   rw   s      r   msgoutModuleFinder.msgout   rz   r   c                     U R                  SSU5        [        R                  " U5       nSS[        4nU R	                  SX!U5        S S S 5        g ! , (       d  f       g = f)Nr   
run_scriptr   r   __main__)rr   r7   r8   r0   load_module)rJ   pathnamefpstuffs       r   r   ModuleFinder.run_script   sJ    L(+\\(#rz*EZu= $##s   A
Ac                    [         R                  R                  U5      u  p#[         R                  R                  U5      u  p4[        R
                  " U5       nUS[        4nU R                  X5X5        S S S 5        g ! , (       d  f       g = f)Nr   )r+   r   splitr9   r7   r8   r0   r   )rJ   r   dirr   extr   r   s          r   	load_fileModuleFinder.load_file   sb    GGMM(+	GG$$T*	\\(#r$
+ETx7 $##s   A>>
Bc                     U R                  SSXX45        U R                  X$S9nU R                  XQ5      u  pgU R                  Xg5      nU(       d  U$ UR                  (       a  U R                  X5        g )Nr   import_hookrm   )rr   determine_parentfind_head_package	load_tailrF   ensure_fromlist)	rJ   r   callerfromlistrm   parentqtailms	            r   r   ModuleFinder.import_hook   sg    M4A&&v&;((6NN1#H::  -r   c                 (   U R                  SSX5        U(       a  US:X  a  U R                  SS5        g UR                  nUS:  a  UR                  (       a  US-  nUS:X  a*  U R                  U   nXAL d   eU R                  SSU5        U$ UR                  S5      U:  a  [        S5      eSR                  UR                  S5      S U*  5      nU R                  U   nU R                  SSU5        U$ UR                  (       a*  U R                  U   nXL d   eU R                  SSU5        U$ SU;   aL  UR                  S5      nUS U nU R                  U   nUR                  U:X  d   eU R                  SSU5        U$ U R                  SS5        g )	N   r   r   zdetermine_parent -> Noner   zdetermine_parent ->.zrelative importpath too deep)
rx   r|   rD   rF   r]   countr"   joinr   rfind)rJ   r   rm   pnamer   rp   s         r   r   ModuleFinder.determine_parent   s   

1(&8!KK56A:
ze,'''A4f={{3%'!"@AAHHU[[-gv67E\\%(FKK0&9M??\\%(F###KK0&9M%<C A"1IE\\%(F??e+++KK0&9MA12r   c                    U R                  SSX5        SU;   a  UR                  S5      nUS U nX#S-   S  nOUnSnU(       a  UR                  < SU< 3nOUnU R                  XFU5      nU(       a  U R	                  SSXu45        Xu4$ U(       a4  UnS nU R                  XFU5      nU(       a  U R	                  SSXu45        Xu4$ U R	                  SSU5        [        SU-   5      e)	Nr   r   r   r   r   zfind_head_package ->"raise ImportError: No module namedNo module named )rx   findrD   import_moduler|   r"   )rJ   r   r   rp   headr   qnamer   s           r   r   ModuleFinder.find_head_package   s    

1)68$;		#A8D!:DDD%5EEtF3KK1A9=7NEF""47AA5yAwA;UC,u455r   c                 j   U R                  SSX5        UnU(       a  UR                  S5      nUS:  a  [        U5      nUS U X$S-   S  p%UR                  < SU< 3nU R	                  XVU5      nU(       d!  U R                  SSU5        [        SU-   5      eU(       a  M  U R                  SSU5        U$ )	Nr   r   r   r   r   r   r   zload_tail ->)rx   r   lenrD   r   r|   r"   )rJ   r   r   r   rp   r   mnames          r   r   ModuleFinder.load_tail   s    

1k1+		#A1u#d)abq4!:$ zz40E""42AACUK!"4u"<== d 	A~q)r   c                 P   U R                  SSXU5        U H  nUS:X  a7  U(       d.  U R                  U5      nU(       a  U R                  XS5        M<  M>  M@  [        X5      (       a  MR  UR                  < SU< 3nU R                  XFU5      nU(       a  M  [        SU-   5      e   g )Nr   r   *r   r   r   )rr   find_all_submodulesr   hasattrrD   r   r"   )rJ   r   r   	recursivesuballsubnamesubmods           r   r   ModuleFinder.ensure_fromlist   s    %qI>Ccz 2215C,,QQ7  ! Q__%&ZZ5++C!<v%&87&BCC r   c                 4   UR                   (       d  g 0 n/ nU[        R                  R                  S S  -  nU[        R                  R                  S S  -  nU[        R                  R
                  S S  -  nUR                    H_  n [        R                  " U5      nU H?  nS nU H  n[        U5      n	Xi* S  U:X  d  M  US U	*  n  O   U(       d  M3  US:w  d  M;  XrU'   MA     Ma     UR                  5       $ ! [         a    U R                  SSU5         M  f = f)Nr   zcan't list directoryrK   )rF   r   r   EXTENSION_SUFFIXESSOURCE_SUFFIXESBYTECODE_SUFFIXESr+   listdirOSErrorrr   r   keys)
rJ   r   r]   suffixesr   namesr   modsuffns
             r   r    ModuleFinder.find_all_submodules  s   zz I''::1==I''77::I''99!<<::C

3 $DD	ABCyD("3QBi	 %
 33*,#&CL   ||~  2C8s   C66DDc                    U R                  SSXU5         U R                  U   nU R                  SSU5        U$ ! [         a     Of = fX R                  ;   a  U R                  SS5        g U(       a   UR
                  c  U R                  SS5        g  U R                  UU=(       a    UR
                  U5      u  pVnO#! [         a    U R                  SSS 5         g f = f U R                  X%Xg5      nU(       a  UR                  5         O! U(       a  UR                  5         f f = fU(       a  [        X1U5        U R                  SSU5        U$ )Nr   r   zimport_module ->zimport_module -> None)rx   r]   r|   KeyErrorr^   rF   find_moduler"   r   closesetattr)rJ   partnamefqnamer   r   r   r   r   s           r   r   ModuleFinder.import_module)  s8   

1ox@	V$A KK-q1H	  		
 __$KK23foo-KK23	"&"2"28393Mfoov#WB% 	KK-t4		  X=A
 
 Fa(A)1-s-   : 
AA)B> >CC"D D&c                    Uu  pVnU R                  SSX=(       a    SU5        U[        :X  a&  U R                  X5      nU R                  SSU5        U$ U[        :X  a  [        UR                  5       US5      n	O`U[        :X  aT   UR                  5       n
[        R                  R                  X0 5        [        R                  " [        U
5      SS  5      n	OS n	U R!                  U5      nX8l        U	(       a9  U R$                  (       a  U R'                  U	5      n	Xl        U R+                  X5        U R                  SSU5        U$ ! [         a%  nU R                  SS[        U5      -   U5        e S nAff = f)Nr   r   r   zload_module ->execzraise ImportError:    )rx   r-   load_packager|   r0   compilereadr5   r   _bootstrap_external_classify_pycr"   rn   marshalloads
memoryview
add_modulerE   rb   replace_paths_in_coderG   	scan_code)rJ   r   r   r   	file_infor>   modetyper   codataexcs               r   r   ModuleFinder.load_moduleI  s@   &d

1mV[D(C>!!!&3AKK+Q/H:Hf5B\!wwy--;;D"M z$/45BBOOF#
!!//3JNN2!A'+  A4s3x?Js   0E 
E4 E//E4c                     XR                   ;  a  0 U R                   U'   U(       a  SU R                   U   UR                  '   g SU R                   U   S'   g )Nr   -)r^   rD   )rJ   r   r   s      r   _add_badmoduleModuleFinder._add_badmodulef  sG    &$&DOOD!56DOOD!&//2)*DOOD!#&r   c           	         XR                   ;   a  U R                  X5        g  U R                  XUS9  U(       aG  U H@  nUS-   U-   nX`R                   ;   a  U R                  Xb5        M-   U R                  XU/US9  MB     g g ! [         a8  nU R	                  SS[        U5      5        U R                  Xb5         S nAM  S nAff = f! [         a7  nU R	                  SS[        U5      5        U R                  X5         S nAg S nAf[         a7  nU R	                  SS[        U5      5        U R                  X5         S nAg S nAff = f)Nr   r   r   zImportError:zSyntaxError:)r^   r   r   r"   rr   rn   SyntaxError)rJ   r   r   r   rm   r   fullnamerr   s           r   _safe_import_hookModuleFinder._safe_import_hookn  s)   ??"-	>T7 #C#czC/H??2++H= >((uE(J $  ' >NCH=++H==>  	.HHQC1-- 	.HHQC1--	.s;   C *B
C-B??C
E-DE-EEc              #      #    [         R                  " U5       H
  nSU44v   M     [         R                  " U5       H  u  p#nUS:X  a	  SXB44v   M  SX4U44v   M     g 7f)Nstorer   absolute_importrelative_import)dis_find_store_names_find_imports)rJ   r   r   rm   r   s        r   scan_opcodesModuleFinder.scan_opcodes  sf     ))"-DD7"" .%(%6%6r%:!Dz'()999'%4)@@@	 &;s   AAc                 "   UR                   nU R                  nU" U5       GH  u  pVUS:X  a  Uu  nSUR                  U'   M!  US:X  Ga"  Uu  pSn	Ub!  SU;   a  Sn	U V
s/ s H  oS:w  d  M
  U
PM     nn
U R                  XrUSS9  U	(       a  S nUR                  (       a+  U R
                  R                  UR                  S-   U-   5      nUc  U R
                  R                  U5      nUbl  UR                  R                  UR                  5        UR                  R                  UR                  5        UR                  c  SUR                  U'   GM2  GM5  SUR                  U'   GMG  GMJ  US:X  aM  Uu  pnU(       a  U R                  XrXS9  GMo  U R                  X,S9nU R                  UR                  S USS9  GM  [        U5      e   UR                   H0  n[        U[        U5      5      (       d  M  U R!                  X5        M2     g s  sn
f )	Nr   r   r   r   r   r   r   r   )co_coder   rH   r   rF   r]   getrD   updaterI   rG   r   RuntimeError	co_constsr.   r   r   )rJ   r   r   codescannerwhatro   r   r   	have_starfmmrm   r   cs                  r   r   ModuleFinder.scan_code  s   zz##!"+JDw&'d#**!%	'h$%	+3@8aCx8H@&&t&B Bzz "\\--ajj3.>.EFz!\\--d3~,,R^^<,,R^^<;;.23AMM$/ / /0d+% & **(,%**4H*J!2212BF**6??D(RS*T #4((Q &T A!T"X&&q$ A  As   	H+Hc                    U R                  SSX5        [        R                  U5      nU(       a  UnU R                  U5      nX$l        U/Ul        UR
                  [        R                  U/ 5      -   Ul        U R                  SUR
                  5      u  pVn U R                  XXg5        U R                  SSU5        UU(       a  UR                  5         $ $ ! U(       a  UR                  5         f f = f)Nr   r   rK   zload_package ->)rx   r   r   r   rE   rF   r   r   r   r|   r   )rJ   r   r   r   r   r   bufr   s           r   r   ModuleFinder.load_package  s    

1nf7#''/FOOF#
Z
 ZZ."4"4VR"@@
))*ajjA	V4KK,a0
 r
 s   &C C2c                 v    XR                   ;   a  U R                   U   $ [        U5      =U R                   U'   nU$ r
   )r]   rA   )rJ   r   r   s      r   r   ModuleFinder.add_module  s7    \\!<<''#)&>1Vqr   c                     Ub  UR                   S-   U-   nOUnX@R                  ;   a  U R                  SSU5        [        U5      eUc,  U[        R
                  ;   a  S S SS[        44$ U R                  n[        X5      $ )Nr   r   zfind_module -> Excludedr   )	rD   ra   r|   r"   r\   builtin_module_namesr&   r   r?   )rJ   r   r   r   r   s        r   r   ModuleFinder.find_module  s    s*4/HH}}$KK4h?d##<s///dRZ$89999DD''r   c           	      0   [        5         [        SS-  5        [        SS-  5        [        U R                  R                  5       5      nU HZ  nU R                  U   nUR                  (       a  [        SSS9  O
[        SSS9  [        SU-  UR
                  =(       d    S	5        M\     U R                  5       u  pEU(       aa  [        5         [        S
5        U HF  n[        U R                  U   R                  5       5      n[        SUSSR                  U5      5        MH     U(       al  [        5         [        SSS9  [        S5        U HF  n[        U R                  U   R                  5       5      n[        SUSSR                  U5      5        MH     gg)zPrint a report to stdout, listing the found modules with their
paths, as well as modules that are missing, or seem to be missing.
z
  %-25s %s)NameFile)----r  Prg   rh   r   z%-25sr   zMissing modules:?zimported fromrN   z7Submodules that appear to be missing, but could also bez#global names in the parent package:N)	rk   sortedr]   r   rF   rE   any_missing_mayber^   r   )rJ   r   keyr   missingmayber   modss           r   reportModuleFinder.report  sE    	l--.l--.dll'')*CS!Azzcs#cs#'C-!1r2  //1G$%dood388:;c4$))D/B   GKQTU78dood388:;c4$))D/B 	 r   c                 .    U R                  5       u  pX-   $ )zReturn a list of modules that appear to be missing. Use
any_missing_maybe() if you want to know which modules are
certain to be missing, and which *may* be missing.
)r  )rJ   r  r  s      r   any_missingModuleFinder.any_missing  s    
 //1r   c                 <   / n/ nU R                    H  nX0R                  ;   a  M  UR                  S5      nUS:  a  UR                  U5        M>  X4S-   S nUSU nU R                  R                  U5      nUbm  X`R                   U   ;   a  UR                  U5        M  XWR                  ;   a  M  UR                  (       a  UR                  U5        M  UR                  U5        M  UR                  U5        M     UR                  5         UR                  5         X4$ )a~  Return two lists, one with modules that are certainly missing
and one with modules that *may* be missing. The latter names could
either be submodules *or* just global names in the package.

The reason it can't always be determined is that it's impossible to
tell which names are imported when "from module import *" is done
with an extension module, short of actually importing it.
r   r   r   N)	r^   ra   r   r   r]   r   rH   rI   sort)rJ   r  r  r   rp   r   pkgnamepkgs           r   r  ModuleFinder.any_missing_maybe  s     OOD}}$

3A1ut$Q34jG2AhG,,""7+Cood33 NN4(/__ LL& NN4(t$= $> 	

~r   c                    [         R                  R                  UR                  5      =p#U R                   H-  u  pEUR                  U5      (       d  M  XS[        U5      S  -   n  O   U R                  (       aa  X0R                  ;  aR  X#:w  a  U R                  SSU< SU< 35        OU R                  SSU< S35        U R                  R                  U5        [        UR                  5      n[        [        U5      5       H6  n[        Xg   [        U5      5      (       d  M!  U R!                  Xg   5      Xg'   M8     UR#                  [%        U5      US9$ )Nr   zco_filename z changed to z remains unchanged)r   co_filename)r+   r   normpathr!  rb   
startswithr   r_   rc   r|   r   listr   rj   r.   r   r   replacetuple)rJ   r   new_filenameoriginal_filenamer   rconstsrp   s           r   r   "ModuleFinder.replace_paths_in_codeH  s   +-77+;+;BNN+KK&&DA ++A.. SVW#== '
 ::+3G3GG0A'8 H I A'8 ; <  ''(9:bll#s6{#A&)T"X.. 66vyA	 $ zzE&M|zLLr   )r^   r_   ra   r`   r]   r   rc   rb   )Nr   NN)NNr   )r   )r   r
   )rD   rS   rT   rU   rK   rr   rx   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   rV   rW   r   r   rY   rY   w   s    
">8	!F66D8@:+>4A/%b*($ CD,\Mr   rY   c                     SS K n  U R                  [        R                  SS  S5      u  pSnSn/ n/ nU H`  u  pUS:X  a  US-   nUS:X  a  SnUS:X  a!  XiR                  [        R                  5      -   nUS:X  a  SnUS:X  d  MO  UR                  U	5        Mb     U(       d  S	n
OUS   n
[        R                  S S  n[        R                  R                  U
5      US'   Xk-   nUS:  a)  [	        S
5        U H  n[	        S[        U5      5        M     [        XU5      nUSS   HZ  nUS:X  a  SnM  U(       a5  USS  S:X  a  UR                  US S S S/5        M6  UR                  U5        MI  UR                  U5        M\     UR                  U
5        UR!                  5         U$ ! U R                   a  n[	        U5         S nAg S nAff = f)Nr   r   zdmp:qx:z-dz-mz-pz-qz-xzhello.pyzpath:rf   z.*r   )getoptr\   argverrorrk   r   r+   pathsepr   r   r,   rl   rY   r   r   r   r  )r.  optsro   rr   r_   domodsaddpathexcludeoascriptr   itemmfrq   s                  r   testr;  `  s   ]]388AB<;
 EFGG9AIE9F9

 33G9E9NN1  a 88A;Dggoof%DG>DqygD%d$  
d7	+BABx$;F23x4s3Bxu5s#LL  MM&IIKIg << c
s   %F" "G2GGr   z
[interrupted]r
   )__doc__r   importlib._bootstrap_externalr   importlib.machineryr   r+   r7   r\   r6   r0   r5   r3   r-   r&   r(   r   r   r   r   r?   rA   rY   r;  rD   r:  KeyboardInterruptrk   rW   r   r   <module>r@     s    9 
 $   	 	 
 


 <  )/1d 0fM fMR8v z!V   ! !s   A# #A43A4