o
    …9jQ_  ã                   @   s
  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ej	d Z
ej	d Zej	d Zej	d ZeefZejZdZdZdZd	Zd
ZdZdZi Zdd„ Zi Zdd„ Zddd„ZG dd„ dƒZG dd„ dƒZdd„ Zedkrƒzeƒ Z W dS  e!y‚   e"dƒ Y dS w dS )z3Find modules used by a script, using introspection.é    NÚ
LOAD_CONSTÚIMPORT_NAMEÚ
STORE_NAMEÚSTORE_GLOBALé   é   é   é   é   é   c                 C   s   t  | g ¡ |¡ d S ©N)ÚpackagePathMapÚ
setdefaultÚappend)ÚpackagenameÚpath© r   ú#/usr/lib/python3.10/modulefinder.pyÚAddPackagePath&   s   r   c                 C   s   |t | < d S r   )ÚreplacePackageMap)ÚoldnameÚnewnamer   r   r   ÚReplacePackage1   s   r   c                 C   s  t jj ¡  t jj | |¡}|du rtdj| d�| d�‚|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 | ¡rOdtj |¡ddtffS t|jt jjƒrZt}nt|jt jjƒret}nt|jt jjƒrpt}nddddtffS t |¡}tj |¡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Úsuffixr   r   r   Ú_find_module5   s*   
r>   c                   @   s   e Zd Zddd„Zdd„ ZdS )ÚModuleNc                 C   s(   || _ || _|| _d | _i | _i | _d S r   )Ú__name__Ú__file__Ú__path__Ú__code__ÚglobalnamesÚstarimports)Úselfr   r<   r   r   r   r   Ú__init__d   s   
zModule.__init__c                 C   sL   d| j f }| jd ur|d| jf  }| jd ur |d| jf  }|d }|S )Nz	Module(%rz, %rú))r@   rA   rB   )rF   Úsr   r   r   Ú__repr__q   s   

zModule.__repr__)NN)r@   Ú
__module__Ú__qualname__rG   rJ   r   r   r   r   r?   b   s    
r?   c                   @   sà   e Zd Zd6dd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Zd7dd„Z	d8dd„Z
dd„ Zdd„ Zd9dd„Zdd„ Zdd„ Zdd„ Zd d!„ Zd8d"d#„Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd:d,d-„Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ ZdS );ÚModuleFinderNr   c                 C   sZ   |d u rt j}|| _i | _i | _|| _d| _|d ur|ng | _|d ur%|ng | _g | _d S )Nr   )	Úsysr   ÚmodulesÚ
badmodulesÚdebugÚindentÚexcludesÚreplace_pathsÚprocessed_paths)rF   r   rQ   rS   rT   r   r   r   rG   |   s   
zModuleFinder.__init__c                 G   sZ   || j kr+t| jƒD ]}tddd� q
t|dd� |D ]
}tt|ƒdd� qtƒ  d S d S )Nú   ú ©Úend)rQ   ÚrangerR   ÚprintÚrepr)rF   ÚlevelÚstrÚargsÚiÚargr   r   r   Úmsgˆ   s   

úzModuleFinder.msgc                 G   s0   |d }|| j kr| jd | _| j|Ž  d S d S ©Nr   r   ©rQ   rR   rb   ©rF   r_   r]   r   r   r   Úmsgin‘   ó
   
þzModuleFinder.msginc                 G   s0   |d }|| j kr| jd | _| j|Ž  d S d S rc   rd   re   r   r   r   Úmsgout—   rg   zModuleFinder.msgoutc                 C   sX   |   dd|¡ t |¡�}ddtf}|  d|||¡ W d   ƒ d S 1 s%w   Y  d S )Nr   Ú
run_scriptr   r   Ú__main__)rb   r6   r7   r0   Úload_module)rF   ÚpathnameÚfpÚstuffr   r   r   ri   �   s
   
"þzModuleFinder.run_scriptc                 C   sj   t j |¡\}}t j |¡\}}t |¡�}|dtf}|  ||||¡ W d   ƒ d S 1 s.w   Y  d S )Nr   )r+   r   Úsplitr8   r6   r7   r0   rk   )rF   rl   Údirr   Úextrm   rn   r   r   r   Ú	load_file£   s   
"þzModuleFinder.load_filer   c           	      C   s\   |   dd||||¡ | j||d�}|  ||¡\}}|  ||¡}|s#|S |jr,|  ||¡ d S )Nr   Úimport_hook©r]   )rb   Údetermine_parentÚfind_head_packageÚ	load_tailrB   Úensure_fromlist)	rF   r   ÚcallerÚfromlistr]   ÚparentÚqÚtailÚmr   r   r   rs   ª   s   zModuleFinder.import_hookc                 C   sJ  |   dd||¡ |r|dkr|  dd¡ d S |j}|dkrb|jr$|d8 }|dkr<| j| }||u s3J ‚|  dd|¡ |S | d¡|k rGtdƒ‚d | d¡d | … ¡}| j| }|  dd|¡ |S |jry| j| }||u spJ ‚|  dd|¡ |S d|v r�| 	d¡}|d |… }| j| }|j|ks”J ‚|  dd|¡ |S |  dd¡ d S )	Né   ru   r   zdetermine_parent -> Noner   zdetermine_parent ->Ú.zrelative importpath too deep)
rf   rh   r@   rB   rO   Úcountr"   Újoinro   Úrfind)rF   ry   r]   Úpnamer{   r`   r   r   r   ru   µ   sB   




zModuleFinder.determine_parentc                 C   sÞ   |   dd||¡ d|v r | d¡}|d |… }||d d … }n|}d}|r.d|j|f }n|}|  |||¡}|rF|  dd||f¡ ||fS |rb|}d }|  |||¡}|rb|  dd||f¡ ||fS |  dd|¡ td	| ƒ‚)
Nr   rv   r€   r   r   ú%s.%szfind_head_package ->ú"raise ImportError: No module namedúNo module named )rf   Úfindr@   Úimport_modulerh   r"   )rF   r{   r   r`   Úheadr}   Úqnamer|   r   r   r   rv   Ø   s.   
zModuleFinder.find_head_packagec                 C   s    |   dd||¡ |}|rG| d¡}|dk rt|ƒ}|d |… ||d d … }}d|j|f }|  |||¡}|sE|  dd|¡ td| ƒ‚|s|  dd	|¡ |S )
Nr   rw   r€   r   r   r…   r†   r‡   zload_tail ->)rf   rˆ   Úlenr@   r‰   rh   r"   )rF   r|   r}   r~   r`   rŠ   Úmnamer   r   r   rw   ó   s   
ø	zModuleFinder.load_tailc                 C   s€   |   dd|||¡ |D ]2}|dkr"|s!|  |¡}|r!|  ||d¡ qt||ƒs=d|j|f }|  |||¡}|s=td| ƒ‚qd S )Nr   rx   Ú*r   r…   r‡   )rb   Úfind_all_submodulesrx   Úhasattrr@   r‰   r"   )rF   r~   rz   Ú	recursiveÚsubÚallÚsubnameÚsubmodr   r   r   rx     s   
€
€özModuleFinder.ensure_fromlistc           
   	   C   sê   |j sd S i }g }|tjjd d … 7 }|tjjd d … 7 }|tjjd d … 7 }|j D ]F}zt |¡}W n tyC   |  	dd|¡ Y q*w |D ])}d }|D ]}t
|ƒ}	||	 d … |krd|d |	 … } nqL|ro|dkro|||< qFq*| ¡ S )Nr   zcan't list directoryrG   )rB   r   r   ÚEXTENSION_SUFFIXESÚSOURCE_SUFFIXESÚBYTECODE_SUFFIXESr+   ÚlistdirÚOSErrorrb   rŒ   Úkeys)
rF   r~   rO   Úsuffixesrp   Únamesr   ÚmodÚsuffÚnr   r   r   r�     s6   
þþ€ø	z ModuleFinder.find_all_submodulesc                 C   s  |   dd|||¡ z| j| }W n	 ty   Y n
w |  dd|¡ |S || jv r0|  dd¡ d S |r?|jd u r?|  dd¡ d S z|  ||oG|j|¡\}}}W n ty_   |  ddd ¡ Y d S w z|  ||||¡}W |rp| 	¡  n|rx| 	¡  w w |r�t
|||ƒ |  dd|¡ |S )Nr   r‰   zimport_module ->zimport_module -> None)rf   rO   ÚKeyErrorrh   rP   rB   Úfind_moduler"   rk   ÚcloseÚsetattr)rF   ÚpartnameÚfqnamer{   r~   rm   rl   rn   r   r   r   r‰   ,  sD   ÿ

ÿþ€ÿ
ÿzModuleFinder.import_modulec              
   C   s  |\}}}|   dd||od|¡ |tkr#|  ||¡}|  dd|¡ |S |tkr0t| ¡ |dƒ}	n9|tkrgz| ¡ }
tj	 
|
|i ¡ W n tyZ } z|  ddt|ƒ |¡ ‚ d }~ww t t|
ƒdd … ¡}	nd }	|  |¡}||_|	r„| jr{|  |	¡}	|	|_|  |	|¡ |  dd|¡ |S )Nr   rk   rm   zload_module ->Úexeczraise ImportError: é   )rf   r-   Úload_packagerh   r0   ÚcompileÚreadr4   r   Ú_bootstrap_externalÚ_classify_pycr"   r^   ÚmarshalÚloadsÚ
memoryviewÚ
add_modulerA   rT   Úreplace_paths_in_coderC   Ú	scan_code)rF   r¦   rm   rl   Ú	file_infor=   ÚmodeÚtyper~   ÚcoÚdataÚexcr   r   r   rk   L  s8   
€þ

zModuleFinder.load_modulec                 C   s>   || j vr
i | j |< |rd| j | |j< d S d| j | d< d S )Nr   ú-)rP   r@   )rF   r   ry   r   r   r   Ú_add_badmodulei  s
   

zModuleFinder._add_badmodulec                 C   sJ  || j v r|  ||¡ d S z
| j|||d� W nC ty9 } z|  ddt|ƒ¡ |  ||¡ W Y d }~d S d }~w tyZ } z|  ddt|ƒ¡ |  ||¡ W Y d }~d S d }~ww |r¡|D ]C}|d | }|| j v rs|  ||¡ q_z| j|||g|d� W q_ ty  } z|  ddt|ƒ¡ |  ||¡ W Y d }~q_d }~ww d S d S )Nrt   r   zImportError:zSyntaxError:r€   )rP   r»   rs   r"   rb   r^   ÚSyntaxError)rF   r   ry   rz   r]   rb   r’   Úfullnamer   r   r   Ú_safe_import_hookq  s:   
€€þ
€þøzModuleFinder._safe_import_hookc                 c   sö   � |j }|j}|j}dd„ t |¡D ƒ}t|ƒD ]`\}\}}|tv r+d|| ffV  q|tkrx|dkrx||d  d ||d  d   krItkrxn q|||d  d  }	|||d  d  }
|	dkrmd|
|| ffV  n
d|	|
|| ffV  qqd S )	Nc                 S   s"   g | ]\}}}|t kr||f‘qS r   )ÚEXTENDED_ARG)Ú.0Ú_Úopra   r   r   r   Ú
<listcomp>�  s    ÿz-ModuleFinder.scan_opcodes.<locals>.<listcomp>Ústorer   r   r   Úabsolute_importÚrelative_import)	Úco_codeÚco_namesÚ	co_constsÚdisÚ_unpack_opargsÚ	enumerateÚ	STORE_OPSr   r   )rF   r·   Úcoder�   ÚconstsÚopargsr`   rÂ   Úopargr]   rz   r   r   r   Úscan_opcodes‹  s&   €0€ôzModuleFinder.scan_opcodesc                 C   s|  |j }| j}||ƒD ]ž\}}|dkr|\}d|j|< q
|dkr~|\}}d}	|d ur6d|v r/d}	dd„ |D ƒ}| j|||dd� |	r}d }
|jrQ| j |jd	 | ¡}
|
d u r[| j |¡}
|
d urx|j |
j¡ |j	 |
j	¡ |
j
d u rwd|j	|< q
d|j	|< q
|d
kr¥|\}}}|r“| j||||d� q
| j||d�}| j|jd |dd� q
t|ƒ‚|jD ]}t|t|ƒƒr»|  ||¡ q¬d S )NrÄ   r   rÅ   r   rŽ   c                 S   s   g | ]}|d kr|‘qS )rŽ   r   )rÀ   Úfr   r   r   rÃ   ­  s    z*ModuleFinder.scan_code.<locals>.<listcomp>rt   r€   rÆ   )rÇ   rÒ   rD   r¾   rB   rO   Úgetr@   ÚupdaterE   rC   ru   ÚRuntimeErrorrÉ   r.   r¶   r³   )rF   r·   r~   rÎ   ÚscannerÚwhatr_   r   rz   Ú	have_starÚmmr]   r{   Úcr   r   r   r³      sP   

€
€

€þzModuleFinder.scan_codec                 C   s¦   |   dd||¡ t |¡}|r|}|  |¡}||_|g|_|jt |g ¡ |_|  d|j¡\}}}z|  ||||¡ |  	dd|¡ |W |rJ| 
¡  S S |rR| 
¡  w w )Nr   r©   rG   zload_package ->)rf   r   rÔ   r±   rA   rB   r   r¢   rk   rh   r£   )rF   r¦   rl   r   r~   rm   Úbufrn   r   r   r   r©   Ñ  s$   


ÿ
ÿzModuleFinder.load_packagec                 C   s*   || j v r
| j | S t|ƒ | j |< }|S r   )rO   r?   )rF   r¦   r~   r   r   r   r±   æ  s   

zModuleFinder.add_modulec                 C   sn   |d ur|j d | }n|}|| jv r|  dd|¡ t|ƒ‚|d u r2|tjv r/d d ddtffS | j}t||ƒS )Nr€   r   zfind_module -> Excludedr   )	r@   rS   rh   r"   rN   Úbuiltin_module_namesr&   r   r>   )rF   r   r   r{   r½   r   r   r   r¢   ì  s   


zModuleFinder.find_modulec                 C   s  t ƒ  t dd ƒ t dd ƒ t| j ¡ ƒ}|D ]!}| j| }|jr)t ddd� nt ddd� t d| |jp7d	ƒ q|  ¡ \}}|rat ƒ  t d
ƒ |D ]}t| j|  ¡ ƒ}t d|dd |¡ƒ qK|rˆt ƒ  t ddd� t dƒ |D ]}t| j|  ¡ ƒ}t d|dd |¡ƒ qrdS dS )z’Print 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à   ÚPrW   rX   r~   z%-25sr   zMissing modules:ú?zimported fromz, z7Submodules that appear to be missing, but could also bez#global names in the parent package:N)	r[   ÚsortedrO   r›   rB   rA   Úany_missing_mayberP   r‚   )rF   r›   Úkeyr~   ÚmissingÚmayber   Úmodsr   r   r   Úreportþ  s4   
úzModuleFinder.reportc                 C   s   |   ¡ \}}|| S )z½Return 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ä   )rF   ræ   rç   r   r   r   Úany_missing   s   zModuleFinder.any_missingc                 C   sÔ   g }g }| j D ]V}|| jv rq| d¡}|dk r| |¡ q||d d… }|d|… }| j |¡}|durX|| j | v rC| |¡ q||jv rIq|jrR| |¡ q| |¡ q| |¡ q| ¡  | ¡  ||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)	rP   rS   rƒ   r   rO   rÔ   rD   rE   Úsort)rF   ræ   rç   r   r`   r”   ÚpkgnameÚpkgr   r   r   rä   (  s0   	




zModuleFinder.any_missing_maybec                 C   sâ   t j |j¡ }}| jD ]\}}| |¡r!||t|ƒd …  } nq| jrH|| jvrH||kr9|  	dd||f ¡ n	|  	dd|f ¡ | j 
|¡ t|jƒ}tt|ƒƒD ]}t|| t|ƒƒrg|  || ¡||< qS|jt|ƒ|d�S )Nr   zco_filename %r changed to %rz co_filename %r remains unchanged)rÉ   Úco_filename)r+   r   Únormpathrî   rT   Ú
startswithrŒ   rQ   rU   rh   r   ÚlistrÉ   rZ   r.   r¶   r²   ÚreplaceÚtuple)rF   r·   Únew_filenameÚoriginal_filenamerÓ   ÚrrÏ   r`   r   r   r   r²   V  s*   
þÿÿ
€z"ModuleFinder.replace_paths_in_code)Nr   NN)NNr   )r   )r   r   )r@   rK   rL   rG   rb   rf   rh   ri   rr   rs   ru   rv   rw   rx   r�   r‰   rk   r»   r¾   rÒ   r³   r©   r±   r¢   ré   rê   rä   r²   r   r   r   r   rM   z   s4    
	

#
 
1
".rM   c               
   C   s®  dd l } z|   tjdd … d¡\}}W n | jy+ } zt|ƒ W Y d }~d S d }~ww d}d}g }g }|D ]-\}}	|dkrB|d }|dkrHd}|dkrT||	 tj¡ }|dkrZd}|dkrc| |	¡ q6|sid	}
n|d }
tj	d d … }tj	 
|
¡|d< || }|dkr”td
ƒ |D ]	}tdt|ƒƒ qŠt|||ƒ}|dd … D ]+}|dkr©d}q |rÆ|dd … dkrÀ| |d d… d dg¡ q | |¡ q | |¡ q | |
¡ | ¡  |S )Nr   r   zdmp:qx:z-dz-mz-pz-qz-xzhello.pyzpath:rV   éþÿÿÿz.*rŽ   )ÚgetoptrN   ÚargvÚerrorr[   ro   r+   Úpathsepr   r   r,   r\   rM   rs   rr   ri   ré   )rø   Úoptsr_   rb   rQ   ÚdomodsÚaddpathÚexcludeÚoÚaÚscriptr   ÚitemÚmfra   r   r   r   Útestn  s^   €þ
€
r  rj   z
[interrupted]r   )#Ú__doc__rÊ   Úimportlib._bootstrap_externalr   Úimportlib.machineryr®   r+   r6   rN   Úopmapr   r   r   r   rÍ   r¿   r5   r0   r4   r2   r-   r&   r(   r   r   r   r   r>   r?   rM   r  r@   r  ÚKeyboardInterruptr[   r   r   r   r   Ú<module>   sN    




-   w;ÿý