
    Rh\                         d 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ddlZdZ	dZ
dZdZdZdZdZi Zd	 Zi Zd
 ZddZ G d d      Z G d d      Zd Zedk(  r		  e       Zyy# e$ r  ed       Y yw xY w)z3Find modules used by a script, using introspection.    N                  c                 N    t         j                  | g       j                  |       y N)packagePathMap
setdefaultappend)packagenamepaths     #/usr/lib/python3.12/modulefinder.pyAddPackagePathr      s    k2.55d;    c                     |t         | <   y r
   )replacePackageMap)oldnamenewnames     r   ReplacePackager   )   s    !(gr   c                     t         j                  j                  j                          t         j                  j                  j	                  | |      }|t        dj                  |       |       |j                  t         j                  j                  u rddddt        ffS |j                  t         j                  j                  u rddddt        ffS |j                  }|j                  j                  |       r)dt        j                  j!                  |      ddt"        ffS t%        |j                  t         j                  j&                        rt(        }nvt%        |j                  t         j                  j*                        rt,        }nAt%        |j                  t         j                  j.                        rt0        }nddddt2        ffS t5        j6                  |      }t        j                  j9                  |      d   }|||d|ffS )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_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	DKK!4!4!H!H	I	DKK!4!4!I!I	J TBM222<<	"DWWi(,FVT4000r   c                       e Zd ZddZd Zy)ModuleNc                 X    || _         || _        || _        d | _        i | _        i | _        y r
   )__name____file____path____code__globalnamesstarimports)selfr   r<   r   s       r   __init__zModule.__init__\   s2      r   c                     d| j                   }| j                  |d| j                  z   }| j                  |d| j                  z   }|dz   }|S )NzModule(, ))rB   rC   rD   )rH   ss     r   __repr__zModule.__repr__i   sR    ==*==$dmm--A==$dmm--AGr   )NN)rB   
__module____qualname__rI   rN    r   r   r@   r@   Z   s    r   r@   c                       e Zd ZddZd Zd Zd Zd Zd ZddZ	dd	Z
d
 Zd ZddZd Zd Zd Zd ZddZd Zd Zd Zd ZddZd Zd Zd Zd Zy) ModuleFinderNc                     |t         j                  }|| _        i | _        i | _        || _        d| _        ||ng | _        ||ng | _        g | _        y )Nr   )	sysr   modules
badmodulesdebugindentexcludesreplace_pathsprocessed_paths)rH   r   rX   rZ   r[   s        r   rI   zModuleFinder.__init__t   sX    <88D	
$,$8b.;.G]R!r   c                     || j                   k  r\t        | j                        D ]  }t        dd        t        |d       |D ]  }t        t	        |      d        t                y y )N    end)rX   rangerY   printrepr)rH   levelstrargsiargs         r   msgzModuleFinder.msg   sa    DJJ4;;' &e%&#3 *d3iS)*G r   c                 t    |d   }|| j                   k  r$| j                  dz   | _         | j                  |  y y Nr   r   rX   rY   rj   rH   rg   re   s      r   msginzModuleFinder.msgin   8    QDJJ++/DKDHHdO r   c                 t    |d   }|| j                   k  r$| j                  dz
  | _         | j                  |  y y rl   rm   rn   s      r   msgoutzModuleFinder.msgout   rp   r   c                     | j                  dd|       t        j                  |      5 }ddt        f}| j	                  d|||       d d d        y # 1 sw Y   y xY w)Nr   
run_scriptr   r   __main__)rj   r6   r7   r0   load_module)rH   pathnamefpstuffs       r   rt   zModuleFinder.run_script   sU    L(+\\(# 	>rz*EZXu=	> 	> 	>s   AAc                    t         j                  j                  |      \  }}t         j                  j                  |      \  }}t	        j
                  |      5 }|dt        f}| j                  ||||       d d d        y # 1 sw Y   y xY w)Nr   )r+   r   splitr8   r6   r7   r0   rv   )rH   rw   dirr   extrx   ry   s          r   	load_filezModuleFinder.load_file   ss    GGMM(+	TGG$$T*	c\\(# 	8r$
+ET2x7	8 	8 	8s   BB
c                     | j                  dd||||       | j                  ||      }| j                  ||      \  }}| j                  ||      }|s|S |j                  r| j                  ||       y )Nr   import_hookre   )rj   determine_parentfind_head_package	load_tailrD   ensure_fromlist)	rH   r   callerfromlistre   parentqtailms	            r   r   zModuleFinder.import_hook   su    M45A&&vU&;((64NN1d#H::  H-r   c                    | j                  dd||       |r|dk(  r| j                  dd       y |j                  }|dk\  r|j                  r|dz  }|dk(  r*| j                  |   }||u sJ | j                  dd|       |S |j                  d      |k  rt        d      dj                  |j                  d      d |        }| j                  |   }| j                  dd|       |S |j                  r*| j                  |   }||u sJ | j                  dd|       |S d|v rK|j                  d      }|d | }| j                  |   }|j                  |k(  sJ | j                  dd|       |S | j                  dd       y )	N   r   r   zdetermine_parent -> Noner   zdetermine_parent ->.zrelative importpath too deep)
ro   rr   rB   rD   rV   countr"   joinr{   rfind)rH   r   re   pnamer   rh   s         r   r   z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V###KK0&9M%<C A"1IE\\%(F??e+++KK0&9MA12r   c                    | j                  dd||       d|v r|j                  d      }|d | }||dz   d  }n|}d}|r|j                  d|}n|}| j                  |||      }|r| j	                  dd||f       ||fS |r2|}d }| j                  |||      }|r| j	                  dd||f       ||fS | j	                  dd|       t        d|z         )	Nr   r   r   r   r   zfind_head_package ->"raise ImportError: No module namedNo module named )ro   findrB   import_modulerr   r"   )rH   r   r   rh   headr   qnamer   s           r   r   zModuleFinder.find_head_package   s    

1)648$;		#A8D!:DDD%5EEtUF3KK1At9=d7NEF""47AA54yA$wA;UC,u455r   c                 L   | j                  dd||       |}|rx|j                  d      }|dk  rt        |      }|d | ||dz   d  }}|j                  d|}| j	                  |||      }|s!| j                  dd|       t        d|z         |rx| j                  dd|       |S )	Nr   r   r   r   r   r   r   zload_tail ->)ro   r   lenrB   r   rr   r"   )rH   r   r   r   rh   r   mnames          r   r   zModuleFinder.load_tail   s    

1k1d+		#A1u#d)abq4!:$D zz40E""42AACUK!"4u"<==  	A~q)r   c                    | j                  dd|||       |D ]s  }|dk(  r+|r| j                  |      }|s| j                  ||d       3t        ||      r@|j                  d|}| j                  |||      }|rgt        d|z          y )Nr   r   *r   r   r   )rj   find_all_submodulesr   hasattrrB   r   r"   )rH   r   r   	recursivesuballsubnamesubmods           r   r   zModuleFinder.ensure_fromlist   s    %q(I> 
	DCcz 2215C,,QQ7Q_%&ZZ5++C!<%&87&BCC
	Dr   c                 
   |j                   sy i }g }|t        j                  j                  d d  z  }|t        j                  j                  d d  z  }|t        j                  j
                  d d  z  }|j                   D ]R  }	 t        j                  |      }|D ]5  }d }|D ]  }t        |      }	||	 d  |k(  s|d |	  } n |s+|dk7  s1|||<   7 T |j                         S # t        $ r | j                  dd|       Y w xY w)Nr   zcan't list directoryrI   )rD   r   r   EXTENSION_SUFFIXESSOURCE_SUFFIXESBYTECODE_SUFFIXESr+   listdirOSErrorrj   r   keys)
rH   r   rV   suffixesr|   namesr   modsuffns
             r   r   z ModuleFinder.find_all_submodules  s$   zz I''::1==I''77::I''99!<<:: 	'C

3  '$ DD	AQBCyD("3QBi	
 3*,#&GCL'	' ||~  2C8s   C##DDc                 r   | j                  dd|||       	 | j                  |   }| j                  dd|       |S # t        $ r Y nw xY w|| j                  v r| j                  dd       y |r|j
                  | j                  dd       y 	 | j                  ||xr |j
                  |      \  }}}n"# t        $ r | j                  ddd        Y y w xY w	 | j                  ||||      }|r)|j                          n# |r|j                          w w xY w|rt        |||       | j                  dd|       |S )Nr   r   zimport_module ->zimport_module -> None)ro   rV   rr   KeyErrorrW   rD   find_moduler"   rv   closesetattr)rH   partnamefqnamer   r   rx   rw   ry   s           r   r   zModuleFinder.import_module$  sD   

1ox@	V$A KK-q1H	  		
 T__$KK23foo-KK23	"&"2"28393Mfoov#WB% 	KK-t4		  Xu=A
 
 FHa(A)1-s-   ; 	AA%B3 3CCC= =Dc                    |\  }}}| j                  dd||xr d|       |t        k(  r'| j                  ||      }| j                  dd|       |S |t        k(  rt        |j                         |d      }	n_|t        k(  rT	 |j                         }
t        j                  j                  |
|i        t        j                  t        |
      dd        }	nd }	| j!                  |      }||_        |	r6| j$                  r| j'                  |	      }	|	|_        | j+                  |	|       | j                  dd|       |S # t        $ r%}| j                  ddt        |      z   |        d }~ww xY w)Nr   rv   rx   zload_module ->execzraise ImportError:    )ro   r-   load_packagerr   r0   compilereadr4   r   _bootstrap_external_classify_pycr"   rf   marshalloads
memoryview
add_modulerC   r[   replace_paths_in_coderE   	scan_code)rH   r   rx   rw   	file_infor=   modetyper   codataexcs               r   rv   zModuleFinder.load_moduleD  sN   &d

1mVR[D(C>!!!&(3AKK+Q/H:Hf5B\!wwy--;;D&"M z$/45BBOOF#
!!//3AJNN2q!A'+  A4s3x?Js   ?1D9 9	E' E""E'c                     || j                   vri | j                   |<   |rd| j                   |   |j                  <   y d| j                   |   d<   y )Nr   -)rW   rB   )rH   r   r   s      r   _add_badmodulezModuleFinder._add_badmodulea  sI    t&$&DOOD!56DOOD!&//2)*DOOD!#&r   c           	         || j                   v r| j                  ||       y 	 | j                  |||       |rH|D ]B  }|dz   |z   }|| j                   v r| j                  ||       ,	 | j                  |||g|       D y y # t        $ r8}| j	                  ddt        |             | j                  ||       Y d }~d }~ww xY w# t        $ r8}| j	                  ddt        |             | j                  ||       Y d }~y d }~wt        $ r8}| j	                  ddt        |             | j                  ||       Y d }~y d }~ww xY w)Nr   r   r   zImportError:zSyntaxError:)rW   r   r   r"   rj   rf   SyntaxError)rH   r   r   r   re   r   fullnamerj   s           r   _safe_import_hookzModuleFinder._safe_import_hooki  s@   4??"f-	>T67 # 	>C#czC/H4??2++Hf= >((vuE(J	>  ' >NCH=++Hf==>  	.HHQC1f-- 	.HHQC1f--	.s;   C (B	C.B>>C	E.DE.EEc              #      K   t        j                  |      D ]	  }d|ff  t        j                  |      D ]  \  }}}|dk(  r	d||ff d|||ff  y w)Nstorer   absolute_importrelative_import)dis_find_store_names_find_imports)rH   r   r   re   r   s        r   scan_opcodeszModuleFinder.scan_opcodes  sy     ))"- 	#DD7""	#%(%6%6r%: 	A!D%z'(D)999'%4)@@@		As   AAc                    |j                   }| j                  } ||      D ]  \  }}|dk(  r|\  }d|j                  |<    |dk(  r|\  }}d}	|d|v rd}	|D 
cg c]
  }
|
dk7  s	|
 }}
| j                  |||d       |	sbd }|j                  r+| j
                  j                  |j                  dz   |z         }|| j
                  j                  |      }|i|j                  j                  |j                         |j                  j                  |j                         |j                  d|j                  |<   #d|j                  |<   4|dk(  rS|\  }}}|r| j                  ||||       X| j                  ||      }| j                  |j                  d |d       t        |       |j                  D ]*  }t        |t        |            s| j!                  ||       , y c c}
w )	Nr   r   r   r   r   r   r   r   )co_coder   rF   r   rD   rV   getrB   updaterG   rE   r   RuntimeError	co_constsr.   r   r   )rH   r   r   codescannerwhatrg   r   r   	have_starfmmre   r   cs                  r   r   zModuleFinder.scan_code  s   zz##!"+ (	)JD$w&'d#**!%$	'h$%	+3@aqCx@H@&&tQ&B Bzz "\\--ajj3.>.EFz!\\--d3~,,R^^<,,R^^<;;.23AMM$/./d+**(,%x**4HE*J!221E2BF**6??D(RS*T #4((Q(	)T  	%A!T"X&q!$	%A  As   
G3%G3c                    | j                  dd||       t        j                  |      }|r|}| j                  |      }||_        |g|_        |j
                  t        j                  |g       z   |_        | j                  d|j
                        \  }}}	 | j                  ||||       | j                  dd|       ||r|j                          S S # |r|j                          w w xY w)Nr   r   rI   zload_package ->)ro   r   r   r   rC   rD   r   r   rv   rr   r   )rH   r   rw   r   r   rx   bufry   s           r   r   zModuleFinder.load_package  s    

1nfh7#''/FOOF#
Z
 ZZ."4"4VR"@@
))*ajjAC	VRe4KK,a0
 r
 s   (C C(c                 t    || j                   v r| j                   |   S t        |      x| j                   |<   }|S r
   )rV   r@   )rH   r   r   s      r   r   zModuleFinder.add_module  s9    T\\!<<''#)&>1Vqr   c                     ||j                   dz   |z   }n|}|| j                  v r| j                  dd|       t        |      |*|t        j
                  v rd d ddt        ffS | j                  }t        ||      S )Nr   r   zfind_module -> Excludedr   )	rB   rZ   rr   r"   rU   builtin_module_namesr&   r   r>   )rH   r   r   r   r   s        r   r   zModuleFinder.find_module  s    s*4/HHt}}$KK4h?d##<s///dRZ$89999DD$''r   c           	         t                t        ddz         t        ddz         t        | j                  j                               }|D ]U  }| j                  |   }|j                  rt        dd       nt        dd       t        d|z  |j
                  xs d	       W | j                         \  }}|r_t                t        d
       |D ]E  }t        | j                  |   j                               }t        d|ddj                  |             G |rmt                t        dd       t        d       |D ]E  }t        | j                  |   j                               }t        d|ddj                  |             G yy)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   Pr_   r`   r   z%-25sr   zMissing modules:?zimported fromrK   z7Submodules that appear to be missing, but could also bez#global names in the parent package:N)	rc   sortedrV   r   rD   rC   any_missing_mayberW   r   )rH   r   keyr   missingmayber   modss           r   reportzModuleFinder.report  sZ    	l--.l--.dll'')* 	3CS!Azzcs#cs#'C-!1r2	3 //1G$% Cdood388:;c4$))D/BC GKQTU78 Cdood388:;c4$))D/BC	 r   c                 2    | j                         \  }}||z   S )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   )rH   r   r   s      r   any_missingzModuleFinder.any_missing  s     
 //1r   c                    g }g }| j                   D ]  }|| j                  v r|j                  d      }|dk  r|j                  |       :||dz   d }|d| }| j                  j                  |      }|b|| j                   |   v r|j                  |       ||j                  v r|j                  r|j                  |       |j                  |       |j                  |        |j                          |j                          ||fS )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)	rW   rZ   r   r   rV   r   rF   rG   sort)rH   r   r   r   rh   r   pkgnamepkgs           r   r   zModuleFinder.any_missing_maybe  s    OO 	%Dt}}$

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

~r   c                    t         j                  j                  |j                        x}}| j                  D ])  \  }}|j                  |      s||t        |      d  z   } n | j                  r]|| j                  vrO||k7  r| j                  dd|d|       n| j                  dd|d       | j                  j                  |       t        |j                        }t        t        |            D ]2  }t        ||   t        |            s| j!                  ||         ||<   4 |j#                  t%        |      |      S )Nr   zco_filename z changed to z remains unchanged)r   co_filename)r+   r   normpathr  r[   
startswithr   rX   r\   rr   r   listr   rb   r.   r   r   replacetuple)rH   r   new_filenameoriginal_filenamer   rconstsrh   s           r   r   z"ModuleFinder.replace_paths_in_codeC  s2   +-77+;+;BNN+KK(&& 	DAq ++A. #4SVW#==	
 ::+43G3GG00A'8 H I A'8 ; <  ''(9:bll#s6{# 	BA&)T"X. 66vayAq		B zzE&M|zLLr   )Nr   NN)NNr   )r   )r   r
   )rB   rO   rP   rI   rj   ro   rr   rt   r~   r   r   r   r   r   r   r   rv   r   r   r   r   r   r   r   r   r   r   r   rQ   r   r   rS   rS   r   s    
">8	!F66D8@:+>4A/%b*($ CD,\Mr   rS   c                  d   dd l } 	 | j                  t        j                  dd  d      \  }}d}d}g }g }|D ][  \  }}	|dk(  r|dz   }|dk(  rd}|dk(  r"||	j                  t        j                        z   }|dk(  rd}|dk(  sK|j                  |	       ] |sd	}
n|d   }
t        j                  d d  }t        j                  j                  |
      |d<   ||z   }|dkD  r't	        d
       |D ]  }t	        dt        |              t        |||      }|dd  D ]O  }|dk(  rd}|r2|dd  dk(  r|j                  |d d d dg       -|j                  |       ?|j                  |       Q |j                  |
       |j!                          |S # | j                  $ r}t	        |       Y d }~y d }~ww xY w)Nr   r   zdmp:qx:z-dz-mz-pz-qz-xzhello.pyzpath:r^   z.*r   )getoptrU   argverrorrc   r{   r+   pathsepr   r   r,   rd   rS   r   r~   rt   r   )r  optsrg   rj   rX   domodsaddpathexcludeoascriptr   itemmfri   s                  r   testr  [  s   ]]388AB<;
d EFGG 
19AIE9F9

 33G9E9NN1
 a 88A;Dggoof%DGT>Dqyg 	%D%d$	% 
dE7	+BABx 
$;F23x4s3Bxu5s#LL
 MM&IIKIg << c
s   &F F/F**F/ru   z
[interrupted]r
   )__doc__r   importlib._bootstrap_externalr   importlib.machineryr   r+   r6   rU   r5   r0   r4   r2   r-   r&   r(   r   r   r   r   r>   r@   rS   r  rB   r  KeyboardInterruptrc   rQ   r   r   <module>r      s    9 
 $   	 	 
 


 <  )*1Z 0fM fMR8v z!V   ! !s   A! !A10A1