U
    adn_                     @   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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#k
r   e$d Y nX 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   "/usr/lib/python3.8/modulefinder.pyAddPackagePath(   s    r   c                 C   s   |t | < d S r   )replacePackageMap)Zoldnamenewnamer   r   r   ReplacePackage3   s    r   c                 C   s  t jj  t jj| |}|dkr8tdj| d| d|jt jjkrVddddt	ffS |jt jj
k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_pathZkindfilesuffixr   r   r   _find_module7   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   r8   r   r   r   r   __init__f   s    zModule.__init__c                 C   sL   d| j f }| jd k	r&|d| jf  }| jd k	r@|d| jf  }|d }|S )Nz	Module(%rz, %r))r<   r=   r>   )rB   sr   r   r   __repr__s   s    

zModule.__repr__)NN)r<   
__module____qualname__rC   rF   r   r   r   r   r;   d   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 krt j}|| _i | _i | _|| _d| _|d k	r8|ng | _|d k	rJ|ng | _g | _d S )Nr   )	sysr   modules
badmodulesdebugindentexcludesreplace_pathsprocessed_paths)rB   r   rM   rO   rP   r   r   r   rC   ~   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)rM   rangerN   printrepr)rB   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   rM   rN   r^   rB   r[   rY   r   r   r   msgin   s    
zModuleFinder.msginc                 G   s,   |d }|| j kr(| jd | _| j|  d S r_   r`   ra   r   r   r   msgout   s    
zModuleFinder.msgoutc              	   C   sB   |  dd| t| }ddtf}| d||| W 5 Q R X d S )Nr   
run_scriptr   r   __main__)r^   r4   r5   r.   load_module)rB   pathnamefpstuffr   r   r   rd      s    
zModuleFinder.run_scriptc              	   C   sT   t j|\}}t j|\}}t| }|dtf}| |||| W 5 Q R X d S )Nr   )r)   r   splitr6   r4   r5   r.   rf   )rB   rg   dirr   Zextrh   ri   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rY   )r^   determine_parentfind_head_package	load_tailr>   ensure_fromlist)	rB   r   callerfromlistrY   parentqtailmr   r   r   rm      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| }||ksft| dd| |S |d|k rtdd|	dd |  }| j| }| dd| |S |jr| j| }||kst| dd| |S d|kr>|
d}|d | }| j| }|j|ks,t| dd| |S | dd d S )	N   ro   r   zdetermine_parent -> Noner   zdetermine_parent ->.zrelative importpath too deep)rb   rc   r<   r>   rK   AssertionErrorcountr    joinrj   rfind)rB   rs   rY   Zpnameru   r\   r   r   r   ro      sB    





zModuleFinder.determine_parentc                 C   s   |  dd|| d|k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 )
Nry   rp   rz   r   r   %s.%szfind_head_package ->"raise ImportError: No module namedNo module named )rb   findr<   import_modulerc   r    )rB   ru   r   r\   headrw   Zqnamerv   r   r   r   rp      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 )
Nry   rq   rz   r   r   r   r   r   zload_tail ->)rb   r   lenr<   r   rc   r    )rB   rv   rw   rx   r\   r   Zmnamer   r   r   rq      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 )Nry   rr   *r   r   r   )r^   find_all_submodulesrr   hasattrr<   r   r    )rB   rx   rt   	recursivesuballsubnameZsubmodr   r   r   rr     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k
r   | 	dd| Y qTY nX |D ]R}d }|D ]0}t
|}	||	 d  |kr|d |	  } qq|r|dkr|||< qqT| S )Nr   zcan't list directoryrC   )r>   r   r   EXTENSION_SUFFIXESSOURCE_SUFFIXESBYTECODE_SUFFIXESr)   listdirOSErrorr^   r   keys)
rB   rx   rK   suffixesrk   namesr   modZsuffnr   r   r   r     s.    

z ModuleFinder.find_all_submodulesc                 C   s
  |  dd||| z| j| }W n tk
r4   Y nX | dd| |S || jkrb| dd d S |r|jd kr| dd d S z| ||o|j|\}}}W n$ tk
r   | ddd  Y d S X z| 	||||}W 5 |r|  X |rt
||| | dd| |S )Nr   r   zimport_module ->zimport_module -> None)rb   rK   KeyErrorrc   rL   r>   find_moduler    closerf   setattr)rB   Zpartnamefqnameru   rx   rh   rg   ri   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k
r } z| ddt| |  W 5 d }~X Y nX tt|
dd  }	nd }	| |}||_|	r| jr| |	}	|	|_| |	| | dd| |S )Nr   rf   rh   zload_module ->execzraise ImportError:    )rb   r+   load_packagerc   r.   compilereadr2   r   _bootstrap_external_classify_pycr    rZ   marshalloads
memoryview
add_moduler=   rP   replace_paths_in_coder?   	scan_code)rB   r   rh   rg   	file_infor9   modetyperx   codataexcr   r   r   rf   N  s4    


zModuleFinder.load_modulec                 C   s<   || j kri | j |< |r*d| j | |j< nd| j | d< d S )Nr   -)rL   r<   )rB   r   rs   r   r   r   _add_badmodulek  s
    

zModuleFinder._add_badmodulec                 C   sB  || j kr| || d S z| j|||d W n~ tk
rn } z"| ddt| | || W 5 d }~X Y n tk
r } z"| ddt| | || W 5 d }~X Y nX |r>|D ]}|d | }|| j kr| || qz| j|||g|d W q tk
r: } z"| ddt| | || W 5 d }~X Y qX qd S )Nrn   r   zImportError:zSyntaxError:rz   )rL   r   rm   r    r^   rZ   SyntaxError)rB   r   rs   rt   rY   r^   r   fullnamer   r   r   _safe_import_hooks  s,    

zModuleFinder._safe_import_hookc                 c   s   |j }|j}|j}dd t|D }t|D ]\}\}}|tk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   )rB   r   coder   constsZopargsr\   r   ZopargrY   rt   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 k	rpd|krbd}	dd |D }| j|||dd |	r\d }
|jr| j|jd	 | }
|
d kr| j|}
|
d k	r|j|
j |j	|
j	 |
j
d k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     s      z*ModuleFinder.scan_code.<locals>.<listcomp>rn   rz   r   )r   r   r@   r   r>   rK   getr<   updaterA   r?   ro   RuntimeErrorr   r,   r   r   )rB   r   rx   r   scannerZwhatr[   r   rt   Z	have_starZmmrY   ru   cr   r   r   r     sH    





zModuleFinder.scan_codec                 C   s   |  dd|| t|}|r"|}| |}||_|g|_|jt|g  |_| d|j\}}}z&| 	|||| | 
dd| |W S |r|  X d S )Nr   r   rC   zload_package ->)rb   r   r   r   r=   r>   r   r   r   rf   rc   )rB   r   rg   r   rx   rh   Zbufri   r   r   r   r     s    

zModuleFinder.load_packagec                 C   s*   || j kr| j | S t| | j |< }|S r   )rK   r;   )rB   r   rx   r   r   r   r     s    

zModuleFinder.add_modulec                 C   sn   |d k	r|j d | }n|}|| jkr<| dd| t||d krd|tjkr^d d ddtffS | j}t||S )Nrz   r   zfind_module -> Excludedr   )	r<   rO   rc   r    rJ   builtin_module_namesr$   r   r:   )rB   r   r   ru   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   PrS   rT   rx   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)	rW   sortedrK   r   r>   r=   any_missing_mayberL   r}   )rB   r   keyrx   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   )rB   r   r   r   r   r   any_missing"  s    zModuleFinder.any_missingc                 C   s   g }g }| j D ]}|| jkrq|d}|dk r<|| q||d d }|d| }| j|}|dk	r|| j | kr|| q||jk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.
        rz   r   r   N)	rL   rO   r~   r   rK   r   r@   rA   sort)rB   r   r   r   r\   r   ZpkgnameZpkgr   r   r   r   *  s0    	




zModuleFinder.any_missing_maybec                 C   s   t j|j }}| jD ]*\}}||r||t|d   } qDq| jr|| jk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   rP   
startswithr   rM   rQ   rc   r   listr   rV   r,   r   r   replacetuple)rB   r   Znew_filenameZoriginal_filenamer   rr   r\   r   r   r   r   X  s&    

z"ModuleFinder.replace_paths_in_code)Nr   NN)NNr   )r   )r   )r   )N)r<   rG   rH   rC   r^   rb   rc   rd   rl   rm   ro   rp   rq   rr   r   r   rf   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rI   |   s2   
	

#
 
1
".rI   c               
   C   s  dd l } z|  tjdd  d\}}W n2 | jk
rX } zt| W Y d S d }~X Y nX d}d}g }g }|D ]Z\}}	|dkr|d }|dkrd}|dkr||	tj }|dkrd}|dkrn||	 qn|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r\d}qF|r|dd  dkr||d d d dg n
|| n
|| qF||
 |  |S )Nr   r   zdmp:qx:z-dz-mz-pz-qz-xzhello.pyzpath:rR   z.*r   )getoptrJ   argverrorrW   rj   r)   pathsepr   r   r*   rX   rI   rm   rl   rd   r   )r   Zoptsr[   r^   rM   ZdomodsZaddpathZexcludeoaZscriptr   itemmfr]   r   r   r   testp  sX    


r   re   z
[interrupted])N)%__doc__r   importlib._bootstrap_externalr   importlib.machineryr   r)   r4   rJ   typeswarningsZopmapr   r   r   r   r   r   r3   r.   r2   r0   r+   r$   r&   r   r   r   r   r:   r;   rI   r   r<   r   KeyboardInterruptrW   r   r   r   r   <module>   sL   




-   w;

