a
    IfQ_                     @   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 n e!y   e"d Y n0 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)Zpackagenamepath r   lib/python3.9/modulefinder.pyAddPackagePath&   s    r   c                 C   s   |t | < d S r   )replacePackageMap)Zoldnamenewnamer   r   r   ReplacePackage1   s    r   c                 C   s  t jj  t jj| |}|du r8tdj| d| d|jt jju rVddddt	ffS |jt jj
u rtddddtffS |j}|j| rdtj|ddtffS t|jt jjrt}n<t|jt jjrt}n&t|jt jjrt}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   specZ	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   r9   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=   r>   r?   )rC   sr   r   r   __repr__q   s    

zModule.__repr__)NN)r=   
__module____qualname__rD   rG   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d:d"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r8|ng | _|d urJ|ng | _g | _d S )Nr   )	sysr   modules
badmodulesdebugindentexcludesreplace_pathsprocessed_paths)rC   r   rN   rP   rQ   r   r   r   rD   |   s    zModuleFinder.__init__c                 G   sV   || j krRt| jD ]}tddd qt|dd |D ]}tt|dd q6t  d S )N    end)rN   rangerO   printrepr)rC   levelstrargsiargr   r   r   msg   s    
zModuleFinder.msgc                 G   s,   |d }|| j kr(| jd | _| j|  d S Nr   r   rN   rO   r_   rC   r\   rZ   r   r   r   msgin   s    
zModuleFinder.msginc                 G   s,   |d }|| j kr(| jd | _| j|  d S r`   ra   rb   r   r   r   msgout   s    
zModuleFinder.msgoutc                 C   sV   |  dd| t|*}ddtf}| d||| W d    n1 sH0    Y  d S )Nr   
run_scriptr   r   __main__)r_   r4   r5   r.   load_module)rC   pathnamefpstuffr   r   r   re      s    
zModuleFinder.run_scriptc                 C   sh   t j|\}}t j|\}}t|*}|dtf}| |||| W d    n1 sZ0    Y  d S )Nr   )r)   r   splitr6   r4   r5   r.   rg   )rC   rh   dirr   Zextri   rj   r   r   r   	load_file   s
    
zModuleFinder.load_filer   c           	      C   s\   |  dd|||| | j||d}| ||\}}| ||}|sF|S |jrX| || d S )Nr   import_hookrZ   )r_   determine_parentfind_head_package	load_tailr?   ensure_fromlist)	rC   r   callerfromlistrZ   parentqtailmr   r   r   rn      s    zModuleFinder.import_hookc                 C   sN  |  dd|| |r|dkr,| dd d S |j}|dkr|jrH|d8 }|dkrx| j| }||u sfJ | dd| |S |d|k rtdd|dd |  }| j| }| dd| |S |jr| j| }||u sJ | dd| |S d|v r>|	d}|d | }| j| }|j|ks,J | dd| |S | dd d S )	N   rp   r   zdetermine_parent -> Noner   zdetermine_parent ->.zrelative importpath too deep)
rc   rd   r=   r?   rL   countr    joinrk   rfind)rC   rt   rZ   Zpnamerv   r]   r   r   r   rp      sB    





zModuleFinder.determine_parentc                 C   s   |  dd|| d|v r@|d}|d | }||d d  }n|}d}|r\d|j|f }n|}| |||}|r| dd||f ||fS |r|}d }| |||}|r| dd||f ||fS | dd| td	| d S )
Nrz   rq   r{   r   r   %s.%szfind_head_package ->"raise ImportError: No module namedNo module named )rc   findr=   import_modulerd   r    )rC   rv   r   r]   headrx   Zqnamerw   r   r   r   rq      s.    
zModuleFinder.find_head_packagec                 C   s   |  dd|| |}|r|d}|dk r2t|}|d | ||d d   }}d|j|f }| |||}|s| dd| td| q| dd	| |S )
Nrz   rr   r{   r   r   r   r   r   zload_tail ->)rc   r   lenr=   r   rd   r    )rC   rw   rx   ry   r]   r   Zmnamer   r   r   rr      s    
zModuleFinder.load_tailc                 C   s   |  dd||| |D ]d}|dkrD|sz| |}|rz| ||d qt||sd|j|f }| |||}|std| qd S )Nrz   rs   *r   r   r   )r_   find_all_submodulesrs   hasattrr=   r   r    )rC   ry   ru   	recursivesuballsubnameZsubmodr   r   r   rs     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 ]}zt|}W n$ ty   | 	dd| Y qTY n0 |D ]R}d }|D ]0}t
|}	||	 d  |kr|d |	  } qq|r|dkr|||< qqT| S )Nr   zcan't list directoryrD   )r?   r   r   EXTENSION_SUFFIXESSOURCE_SUFFIXESBYTECODE_SUFFIXESr)   listdirOSErrorr_   r   keys)
rC   ry   rL   suffixesrl   namesr   modZsuffnr   r   r   r     s.    

z ModuleFinder.find_all_submodulesc                 C   s  |  dd||| z| j| }W n ty2   Y n0 | dd| |S || jv r`| dd d S |r~|jd u r~| dd d S z| ||o|j|\}}}W n" ty   | ddd  Y d S 0 z | ||||}W |r|	  n|r|	  0 |rt
||| | dd| |S )Nr   r   zimport_module ->zimport_module -> None)rc   rL   KeyErrorrd   rM   r?   find_moduler    rg   closesetattr)rC   Zpartnamefqnamerv   ry   ri   rh   rj   r   r   r   r   ,  s<    



zModuleFinder.import_modulec              
   C   s*  |\}}}|  dd||od| |tkrF| ||}| dd| |S |tkr`t| |d}	n~|tkrz| }
tj	
|
|i  W n< ty } z$| ddt| |  W Y d }~n
d }~0 0 tt|
dd  }	nd }	| |}||_|	r| jr| |	}	|	|_| |	| | dd| |S )Nr   rg   ri   zload_module ->execzraise ImportError:    )rc   r+   load_packagerd   r.   compilereadr2   r   _bootstrap_external_classify_pycr    r[   marshalloads
memoryview
add_moduler>   rQ   replace_paths_in_coder@   	scan_code)rC   r   ri   rh   	file_infor:   modetypery   codataexcr   r   r   rg   L  s4    


zModuleFinder.load_modulec                 C   s<   || j vri | j |< |r*d| j | |j< nd| j | d< d S )Nr   -)rM   r=   )rC   r   rt   r   r   r   _add_badmodulei  s
    

zModuleFinder._add_badmodulec                 C   sH  || j v r| || d S z| j|||d W n typ } z*| ddt| | || W Y d }~nd }~0  ty } z*| ddt| | || W Y d }~nd }~0 0 |rD|D ]}|d | }|| j v r| || qz| j|||g|d W q ty@ } z*| ddt| | || W Y d }~qd }~0 0 qd S )Nro   r   zImportError:zSyntaxError:r{   )rM   r   rn   r    r_   r[   SyntaxError)rC   r   rt   ru   rZ   r_   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 rTd|| ffV  q.|tkr.|dkr.||d  d ||d  d   krtkr.n q.|||d  d  }	|||d  d  }
|	dkrd|
|| ffV  q.d|	|
|| ffV  q.q.d S )	Nc                 S   s"   g | ]\}}}|t kr||fqS r   )EXTENDED_ARG).0_opr^   r   r   r   
<listcomp>  s   z-ModuleFinder.scan_opcodes.<locals>.<listcomp>storer   r   r   absolute_importrelative_import)	co_codeco_names	co_constsdisZ_unpack_opargs	enumerate	STORE_OPSr   r   )rC   r   coder   constsZopargsr]   r   ZopargrZ   ru   r   r   r   scan_opcodes  s&    
zModuleFinder.scan_opcodesc                 C   s  |j }| j}||D ]F\}}|dkr8|\}d|j|< q|dkr|\}}d}	|d urpd|v rbd}	dd |D }| j|||dd |	r\d }
|jr| j|jd	 | }
|
d u r| j|}
|
d ur|j|
j |j	|
j	 |
j
d u rd|j	|< n
d|j	|< q|d
krT|\}}}|r0| j||||d n"| j||d}| j|jd |dd qt|q|jD ]"}t|t|rd| || qdd S )Nr   r   r   r   r   c                 S   s   g | ]}|d kr|qS )r   r   )r   fr   r   r   r         z*ModuleFinder.scan_code.<locals>.<listcomp>ro   r{   r   )r   r   rA   r   r?   rL   getr=   updaterB   r@   rp   RuntimeErrorr   r,   r   r   )rC   r   ry   r   scannerZwhatr\   r   ru   Z	have_starZmmrZ   rv   cr   r   r   r     sH    





zModuleFinder.scan_codec                 C   s   |  dd|| t|}|r"|}| |}||_|g|_|jt|g  |_| d|j\}}}z2| |||| | 	dd| |W |r|
  S n|r|
  0 d S )Nr   r   rD   zload_package ->)rc   r   r   r   r>   r?   r   r   rg   rd   r   )rC   r   rh   r   ry   ri   Zbufrj   r   r   r   r     s(    

 zModuleFinder.load_packagec                 C   s*   || j v r| j | S t| | j |< }|S r   )rL   r<   )rC   r   ry   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 rd|tjv r^d d ddtffS | j}t||S )Nr{   r   zfind_module -> Excludedr   )	r=   rP   rd   r    rK   builtin_module_namesr$   r   r;   )rC   r   r   rv   r   r   r   r   r     s    

zModuleFinder.find_modulec                 C   s  t   t dd  t dd  t| j }|D ]B}| j| }|jrRt ddd nt ddd t d| |jpnd	 q0|  \}}|rt   t d
 |D ]*}t| j|  }t d|dd| q|rt   t ddd t d |D ]*}t| j|  }t d|dd| qdS )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)NameZFile)----r   PrT   rU   ry   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)	rX   sortedrL   r   r?   r>   any_missing_mayberM   r}   )rC   r   keyry   missingmayber   Zmodsr   r   r   report  s0    
zModuleFinder.reportc                 C   s   |   \}}|| 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   )rC   r   r   r   r   r   any_missing   s    zModuleFinder.any_missingc                 C   s   g }g }| j D ]}|| jv rq|d}|dk r<|| q||d d }|d| }| j|}|dur|| j | v r|| q||jv rq|jr|| 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)	rM   rP   r~   r   rL   r   rA   rB   sort)rC   r   r   r   r]   r   Zpkgnamepkgr   r   r   r   (  s0    	




zModuleFinder.any_missing_maybec                 C   s   t j|j }}| jD ]*\}}||r||t|d   } qDq| jr|| jvr||krr| 	dd||f  n| 	dd|f  | j
| t|j}tt|D ](}t|| t|r| || ||< q|jt||dS )Nr   zco_filename %r changed to %rz co_filename %r remains unchanged)r   co_filename)r)   r   normpathr   rQ   
startswithr   rN   rR   rd   r   listr   rW   r,   r   r   replacetuple)rC   r   Znew_filenameZoriginal_filenamer   rr   r]   r   r   r   r   V  s&    

z"ModuleFinder.replace_paths_in_code)Nr   NN)NNr   )r   )r   )r   )N)r=   rH   rI   rD   r_   rc   rd   re   rm   rn   rp   rq   rr   rs   r   r   rg   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rJ   z   s2   
	

#
 
1
".rJ   c               
   C   s  dd l } z|  tjdd  d\}}W n0 | jyV } zt| W Y d }~d S d }~0 0 d}d}g }g }|D ]Z\}}	|dkr|d }|dkrd}|dkr||	tj }|dkrd}|dkrl||	 ql|sd	}
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rZd}qD|r|dd  dkr||d d d dg n
|| n
|| qD||
 |  |S )Nr   r   zdmp:qx:z-dz-mz-pz-qz-xzhello.pyzpath:rS   z.*r   )getoptrK   argverrorrX   rk   r)   pathsepr   r   r*   rY   rJ   rn   rm   re   r   )r   Zoptsr\   r_   rN   ZdomodsZaddpathZexcludeoaZscriptr   itemmfr^   r   r   r   testn  sX    


r   rf   z
[interrupted])N)#__doc__r   importlib._bootstrap_externalr   importlib.machineryr   r)   r4   rK   Zopmapr   r   r   r   r   r   r3   r.   r2   r0   r+   r$   r&   r   r   r   r   r;   r<   rJ   r   r=   r   KeyboardInterruptrX   r   r   r   r   <module>   sH   




-   w;

