B
    ܜwaY              	   @   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_filec       	      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 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   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 qW |r|dkr|||< qW 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 |rt
||| | 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ry| }
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 nX |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 }xt|D ]\}\}}|tkrVd|| ffV  q0|tkr0|dkr0||d  d ||d  d   krtkr0n q0|||d  d  }	|||d  d  }
|	dkrd|
|| 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rd|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 |  \}}|rt   t d
 x2|D ]*}t| j|  }t d|dd| qW |rt   t ddd t d x2|D ]*}t| j|  }t d|dd| qW d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)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 )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   )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rq|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| || ||< qW 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rd}|dkr||	tj }|dkrd}|dkrj||	 qjW |sd	}
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;

