B
    \ ÇcûY  ã            	   @   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	e	 
¡  e	 de¡ ddlZW dQ R X ejd Zejd Zejd Zejd ZeefZejZi Zdd	„ Zi Zd
d„ ZG dd„ dƒZG dd„ dƒZdd„ Zedkry
eƒ ZW n ek
r   edƒ Y nX dS )z3Find modules used by a script, using introspection.é    NÚignoreÚ
LOAD_CONSTÚIMPORT_NAMEÚ
STORE_NAMEÚSTORE_GLOBALc             C   s   t  | g ¡ |¡ d S )N)ÚpackagePathMapÚ
setdefaultÚappend)ZpackagenameÚpath© r   úlib/python3.7/modulefinder.pyÚAddPackagePath   s    r   c             C   s   |t | < d S )N)ÚreplacePackageMap)ZoldnameÚnewnamer   r   r   ÚReplacePackage*   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 )N)Ú__name__Ú__file__Ú__path__Ú__code__ÚglobalnamesÚstarimports)ÚselfÚnameÚfiler
   r   r   r   Ú__init__0   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   )r   Úsr   r   r   Ú__repr__=   s    

zModule.__repr__)NN)r   Ú
__module__Ú__qualname__r   r   r   r   r   r   r   .   s   
r   c               @   sè   e Zd Zddg g fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Zd6dd„Z	d7dd„Z
dd„ Zdd„ Zd8dd„Zdd„ Zd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d0d1„ Zd2d3„ Zd4d5„ ZdS );ÚModuleFinderNr   c             C   sB   |d krt j}|| _i | _i | _|| _d| _|| _|| _g | _d S )Nr   )	Úsysr
   ÚmodulesÚ
badmodulesÚdebugÚindentÚexcludesÚreplace_pathsÚprocessed_paths)r   r
   r%   r'   r(   r   r   r   r   H   s    zModuleFinder.__init__c             G   s^   || j krZxt| jƒD ]}tddd qW t|dd x|D ]}tt|ƒdd q<W tƒ  d S )Nz   ú )Úend)r%   Úranger&   ÚprintÚrepr)r   ÚlevelÚstrÚargsÚiÚargr   r   r   ÚmsgT   s    

zModuleFinder.msgc             G   s,   |d }|| j kr(| jd | _| j|Ž  d S )Nr   é   )r%   r&   r4   )r   r1   r/   r   r   r   Úmsgin]   s    
zModuleFinder.msginc             G   s,   |d }|| j kr(| jd | _| j|Ž  d S )Nr   r5   )r%   r&   r4   )r   r1   r/   r   r   r   Úmsgoutc   s    
zModuleFinder.msgoutc          	   C   sB   |   dd|¡ t|ƒ"}ddtjf}|  d|||¡ W d Q R X d S )Né   Ú
run_scriptÚ ÚrÚ__main__)r4   ÚopenÚimpÚ	PY_SOURCEÚload_module)r   ÚpathnameÚfpÚstuffr   r   r   r9   i   s    
zModuleFinder.run_scriptc          	   C   sT   t j |¡\}}t j |¡\}}t|ƒ"}|dtjf}|  ||||¡ W d Q R X d S )Nr;   )Úosr
   ÚsplitÚsplitextr=   r>   r?   r@   )r   rA   Údirr   ZextrB   rC   r   r   r   Ú	load_fileo   s
    
zModuleFinder.load_fileéÿÿÿÿc       	      C   s\   |   dd||||¡ | j||d}|  ||¡\}}|  ||¡}|sF|S |jrX|  ||¡ d S )Né   Úimport_hook)r/   )r4   Údetermine_parentÚfind_head_packageÚ	load_tailr   Úensure_fromlist)	r   r   ÚcallerÚfromlistr/   ÚparentÚqÚtailÚmr   r   r   rK   v   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 rŽtdƒ‚d | 	d¡d | … ¡}| j| }|  dd|¡ |S |jrò| j| }||ksàt‚|  dd|¡ |S d|kr>| 
d¡}|d |… }| j| }|j|ks,t‚|  dd|¡ |S |  dd¡ d S )	Né   rL   r   zdetermine_parent -> Noner5   zdetermine_parent ->Ú.zrelative importpath too deep)r6   r7   r   r   r#   ÚAssertionErrorÚcountÚImportErrorÚjoinrE   Úrfind)r   rP   r/   ZpnamerR   r2   r   r   r   rL      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 )
NrV   rM   rW   r5   r:   z%s.%szfind_head_package ->z"raise ImportError: No module namedzNo module named )r6   Úfindr   Úimport_moduler7   rZ   )r   rR   r   r2   ÚheadrT   ZqnamerS   r   r   r   rM   ¤   s.    
zModuleFinder.find_head_packagec             C   s¢   |   dd||¡ |}xz|rŽ| d¡}|dk r4t|ƒ}|d |… ||d d …  }}d|j|f }|  |||¡}|s|  dd|¡ td| ƒ‚qW |  dd	|¡ |S )
NrV   rN   rW   r   r5   z%s.%sz"raise ImportError: No module namedzNo module named zload_tail ->)r6   r]   Úlenr   r^   r7   rZ   )r   rS   rT   rU   r2   r_   Zmnamer   r   r   rN   ¿   s    
 zModuleFinder.load_tailc             C   s„   |   dd|||¡ xl|D ]d}|dkrF|s||  |¡}|r||  ||d¡ qt||ƒsd|j|f }|  |||¡}|std| ƒ‚qW d S )NrV   rO   Ú*r5   z%s.%szNo module named )r4   Úfind_all_submodulesrO   Úhasattrr   r^   rZ   )r   rU   rQ   Ú	recursiveÚsubÚallÚsubnameZsubmodr   r   r   rO   Î   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 }x |j D ]–}yt |¡}W n$ tk
rŒ   |  	dd|¡ wVY nX x\|D ]T}d }x6|D ].}t
|ƒ}	||	 d … |kr¢|d |	 … }P q¢W |r”|dkr”|||< q”W qVW | ¡ S )Nr8   zcan't list directoryr   )r   Ú	importlibÚ	machineryÚEXTENSION_SUFFIXESÚSOURCE_SUFFIXESÚBYTECODE_SUFFIXESrD   ÚlistdirÚOSErrorr4   r`   Úkeys)
r   rU   r#   ÚsuffixesrG   Únamesr   ÚmodZsuffÚnr   r   r   rb   Ü   s.    

z ModuleFinder.find_all_submodulesc             C   s  |   dd|||¡ y| 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 y|  ||o|j|¡\}}}W n" tk
rÀ   |  ddd ¡ d S X z|  ||||¡}W d |rä| 	¡  X |röt
|||ƒ |  dd|¡ |S )NrJ   r^   zimport_module ->zimport_module -> None)r6   r#   ÚKeyErrorr7   r$   r   Úfind_modulerZ   r@   ÚcloseÚsetattr)r   ZpartnameÚfqnamerR   rU   rB   rA   rC   r   r   r   r^   ø   s6    

zModuleFinder.import_modulec          
   C   s2  |\}}}|   dd||od|¡ |tjkrH|  ||¡}|  dd|¡ |S |tjkrht| ¡ d |dƒ}	n~|tjkrây| ¡ }
t	j
 |
|i ¡ W n: tk
rÈ } z|  ddt|ƒ |¡ ‚ W d d }~X Y nX t t|
ƒdd … ¡}	nd }	|  |¡}||_|	r | jr|  |	¡}	|	|_|  |	|¡ |  dd|¡ |S )	Nr8   r@   rB   zload_module ->Ú
Úexeczraise ImportError: é   )r6   r>   ÚPKG_DIRECTORYÚload_packager7   r?   ÚcompileÚreadÚPY_COMPILEDrh   Ú_bootstrap_externalÚ_classify_pycrZ   r0   ÚmarshalÚloadsÚ
memoryviewÚ
add_moduler   r(   Úreplace_paths_in_coder   Ú	scan_code)r   rx   rB   rA   Ú	file_infoÚsuffixÚmodeÚtyperU   ÚcoÚdataÚexcr   r   r   r@     s4    





zModuleFinder.load_modulec             C   s<   || j kri | j |< |r*d| j | |j< nd| j | d< d S )Nr5   ú-)r$   r   )r   r   rP   r   r   r   Ú_add_badmodule4  s
    

zModuleFinder._add_badmodulec             C   s  || j kr|  ||¡ d S y| j|||d W n@ tk
rn } z"|  ddt|ƒ¡ |  ||¡ W d d }~X Y n”X |rxŠ|D ]‚}|| j kr˜|  ||¡ q|y| j|||g|d W q| tk
rü } z.|  ddt|ƒ¡ |d | }|  ||¡ W d d }~X Y q|X q|W d S )N)r/   r8   zImportError:rW   )r$   r‘   rK   rZ   r4   r0   )r   r   rP   rQ   r/   r4   re   Úfullnamer   r   r   Ú_safe_import_hook<  s&    


zModuleFinder._safe_import_hookc             c   sø   |j }|j}|j}dd„ t |¡D ƒ}xÌt|ƒD ]À\}\}}|tkrVd|| ffV  q0|tkr0|dkr0||d  d ||d  d   kr’tkr0n q0|||d  d  }	|||d  d  }
|	dkrÚd|
|| ffV  q0d|	|
|| ffV  q0q0W d S )	Nc             S   s"   g | ]\}}}|t kr||f‘qS r   )ÚEXTENDED_ARG)Ú.0Ú_Úopr3   r   r   r   ú
<listcomp>X  s    z-ModuleFinder.scan_opcodes.<locals>.<listcomp>Ústorer8   r5   r   Úabsolute_importÚrelative_import)	Úco_codeÚco_namesÚ	co_constsÚdisZ_unpack_opargsÚ	enumerateÚ	STORE_OPSr   r   )r   r   Úcoderq   ÚconstsZopargsr2   r—   Zopargr/   rQ   r   r   r   Úscan_opcodesS  s     0zModuleFinder.scan_opcodesc             C   s–  |j }| j}xT||ƒD ]F\}}|dkr<|\}d|j|< q|dkr|\}}d}	|d k	rtd|krfd}	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rød|j	|< n
d|j	|< q|d
krX|\}}}|r4| j||||d n"| j||d}| j|jd |dd qt|ƒ‚qW x,|jD ]"}t|t|ƒƒrl|  ||¡ qlW d S )Nr™   r5   rš   r   ra   c             S   s   g | ]}|d kr|‘qS )ra   r   )r•   Úfr   r   r   r˜   u  s    z*ModuleFinder.scan_code.<locals>.<listcomp>)r/   rW   r›   )rœ   r¤   r   r“   r   r#   Úgetr   Úupdater   r   rL   ÚRuntimeErrorrž   Ú
isinstancerŒ   rˆ   )r   r   rU   r¢   ÚscannerZwhatr1   r   rQ   Z	have_starZmmr/   rR   Úcr   r   r   rˆ   h  sH    



zModuleFinder.scan_codec             C   s˜   |   dd||¡ t |¡}|r"|}|  |¡}||_|g|_|jt |g ¡ |_|  d|j¡\}}}z"|  ||||¡ |  	dd|¡ |S |r’| 
¡  X d S )Nr8   r}   r   zload_package ->)r6   r   r¦   r†   r   r   r   ru   r@   r7   rv   )r   rx   rA   r   rU   rB   ZbufrC   r   r   r   r}   ™  s    

zModuleFinder.load_packagec             C   s*   || j kr| j | S t|ƒ | j |< }|S )N)r#   r   )r   rx   rU   r   r   r   r†   ®  s    

zModuleFinder.add_modulec             C   sr   |d k	r|j d | }n|}|| jkr<|  dd|¡ t|ƒ‚|d krf|tjkr`d d ddtjffS | j}t 	||¡S )NrW   rJ   zfind_module -> Excludedr:   )
r   r'   r7   rZ   r"   Úbuiltin_module_namesr>   Z	C_BUILTINr
   ru   )r   r   r
   rR   r’   r   r   r   ru   ´  s    

zModuleFinder.find_modulec             C   s"  t ƒ  t dd ƒ t dd ƒ t| j ¡ ƒ}xJ|D ]B}| j| }|jrTt ddd nt ddd t d| |jppd	ƒ q2W |  ¡ \}}|rÊt ƒ  t d
ƒ x2|D ]*}t| j|  ¡ ƒ}t d|dd |¡ƒ qœW |rt ƒ  t ddd t dƒ x2|D ]*}t| j|  ¡ ƒ}t d|dd |¡ƒ qðW 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)ÚNameZFile)z----z----ÚPr*   )r+   rU   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-   Úsortedr#   ro   r   r   Úany_missing_mayber$   r[   )r   ro   ÚkeyrU   ÚmissingÚmayber   Zmodsr   r   r   ÚreportÅ  s0    



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±   )r   r³   r´   r   r   r   Úany_missingç  s    zModuleFinder.any_missingc             C   sØ   g }g }x¶| j D ]¬}|| jkr q| d¡}|dk r>| |¡ q||d d… }|d|… }| j |¡}|dk	r²|| j | krˆ| |¡ q¼||jkr”q¼|jr¦| |¡ q¼| |¡ q| |¡ qW | ¡  | ¡  ||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.
        rW   r   r5   N)	r$   r'   r\   r	   r#   r¦   r   r   Úsort)r   r³   r´   r   r2   rg   ZpkgnameÚpkgr   r   r   r±   ï  s0    	



zModuleFinder.any_missing_maybec             C   s  t j |j¡ }}x2| jD ](\}}| |¡r||t|ƒd …  }P qW | jr’|| jkr’||krt|  	dd||f ¡ n|  	dd|f ¡ | j 
|¡ t|jƒ}x8tt|ƒƒD ](}t|| t|ƒƒrª|  || ¡||< qªW t |j|j|j|j|j|jt|ƒ|j|j||j|j|j|j|j ¡S )Nr8   zco_filename %r changed to %rz co_filename %r remains unchanged)!rD   r
   ÚnormpathÚco_filenamer(   Ú
startswithr`   r%   r)   r7   r	   Úlistrž   r,   r©   rŒ   r‡   ÚtypesÚCodeTypeÚco_argcountÚco_kwonlyargcountÚ
co_nlocalsÚco_stacksizeÚco_flagsrœ   Útupler   Úco_varnamesÚco_nameÚco_firstlinenoÚ	co_lnotabÚco_freevarsÚco_cellvars)r   r   Znew_filenameZoriginal_filenamer¥   r;   r£   r2   r   r   r   r‡     s,    



z"ModuleFinder.replace_paths_in_code)NNrI   )rI   )r   )rI   )N)r   r   r    r   r4   r6   r7   r9   rH   rK   rL   rM   rN   rO   rb   r^   r@   r‘   r“   r¤   rˆ   r}   r†   ru   rµ   r¶   r±   r‡   r   r   r   r   r!   F   s2   	

#

1
".r!   c           
   C   sÄ  dd l } y|   tjdd … d¡\}}W n, | jk
rR } zt|ƒ d S d }~X Y nX d}d}g }g }xb|D ]Z\}}	|dkr‚|d }|dkrŽd}|dkr¦||	 tj¡ }|dkr²d}|dkrj| |	¡ qjW |sÒd	}
n|d }
tj	d d … }tj	 
|
¡|d< || }|dkr0td
ƒ x|D ]}tdt|ƒƒ qW t|||ƒ}xp|dd … D ]`}|dkr`d}qJ|rž|dd … dkr’| |d d… d dg¡ n
| |¡ n
| |¡ qJW | |
¡ | ¡  |S )Nr   r5   zdmp:qx:z-dz-mz-pz-qz-xzhello.pyzpath:z   éþÿÿÿz.*ra   )Úgetoptr"   ÚargvÚerrorr-   rE   rD   Úpathsepr	   r
   Údirnamer.   r!   rK   rH   r9   rµ   )rÌ   Zoptsr1   r4   r%   ZdomodsZaddpathZexcludeÚoÚaZscriptr
   ÚitemÚmfr3   r   r   r   Útest:  sX    



rÕ   r<   z
[interrupted]) Ú__doc__rŸ   Úimportlib._bootstrap_externalrh   Úimportlib.machineryrƒ   rD   r"   r½   ÚwarningsÚcatch_warningsÚsimplefilterÚDeprecationWarningr>   Zopmapr   r   r   r   r¡   r”   r   r   r   r   r   r!   rÕ   r   rÔ   ÚKeyboardInterruptr-   r   r   r   r   Ú<module>   s@   




   w;

