
[[\}[                 @   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   ! e
 j d e  d d l Z Wd QXe e j j d  g  Z e e j j d  g  Z e e j j d  g  Z e e j j d  g  Z e e g Z e e j g  Z i  Z d d	   Z i  Z d
 d   Z Gd d   d  Z Gd d   d  Z d d   Z e d k ry e   Z  Wn e! k
 re" d  Yn Xn  d S)z3Find modules used by a script, using introspection.    Nignore
LOAD_CONSTIMPORT_NAME
STORE_NAMESTORE_GLOBALc             C   s   t  j |  g   j |  d  S)N)packagePathMap
setdefaultappend)Zpackagenamepath r   "/usr/lib/python3.4/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 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__2   s    					zModule.__init__c             C   sj   d |  j  f } |  j d  k	 r6 | d |  j f } n  |  j d  k	 r\ | d |  j f } n  | d } | S)Nz	Module(%rz, %r))r   r   r   )r   sr   r   r   __repr__?   s    
zModule.__repr__)r   
__module____qualname__r   r   r   r   r   r   r   0   s   r   c               @   sc  e  Z d  Z d d g  g  d d  Z d d   Z d d   Z d	 d
   Z d d   Z d d   Z d d d6 d d  Z	 d7 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 d8 d" d#  Z e j d$ d%  Z d& d'   Z d( d)   Z d* d+   Z d d, d-  Z d. d/   Z d0 d1   Z d2 d3   Z d4 d5   Z d S)9ModuleFinderNr   c             C   sd   | d  k r t  j } n  | |  _ 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   J   s    							zModuleFinder.__init__c             G   s~   | |  j  k rz x' t |  j  D] } t d d d q Wt | d d x$ | D] } t t |  d d qP Wt   n  d  S)Nz   end )r%   ranger&   printrepr)r   levelstrargsiargr   r   r   msgV   s    zModuleFinder.msgc             G   s=   | d } | |  j  k r9 |  j d |  _ |  j |   n  d  S)Nr      )r%   r&   r4   )r   r1   r/   r   r   r   msgin_   s    
zModuleFinder.msginc             G   s=   | d } | |  j  k r9 |  j d |  _ |  j |   n  d  S)Nr   r5   )r%   r&   r4   )r   r1   r/   r   r   r   msgoute   s    
zModuleFinder.msgoutc             C   sT   |  j  d d |  t |  / } d d t j f } |  j d | | |  Wd  QXd  S)N   
run_script r__main__)r4   openimp	PY_SOURCEload_module)r   pathnamefpstuffr   r   r   r9   k   s    zModuleFinder.run_scriptc             C   sq   t  j j |  \ } } t  j j |  \ } } t |  / } | d t j f } |  j | | | |  Wd  QXd  S)Nr;   )osr
   splitsplitextr=   r>   r?   r@   )r   rA   dirr   ZextrB   rC   r   r   r   	load_fileq   s
    zModuleFinder.load_filer5   c       	      C   s   |  j  d d | | | |  |  j | d | } |  j | |  \ } } |  j | |  } | se | S| j r |  j | |  n  d  S)N   import_hookr/   )r4   determine_parentfind_head_package	load_tailr   ensure_fromlist)	r   r   callerfromlistr/   parentqtailmr   r   r   rJ   x   s    	zModuleFinder.import_hookc             C   s  |  j  d d | |  | s) | d k r= |  j d d  d  S| j } | d k r| j rh | d 8} n  | d k r |  j | } | | k s t  |  j d d |  | S| j d  | k  r t d   n  d j | j	 d  d  |   } |  j | } |  j d d |  | S| j rT|  j | } | | k s=t  |  j d d |  | Sd | k r| j
 d  } | d  |  } |  j | } | j | k st  |  j d d |  | S|  j d d  d  S)	N   rK   r   zdetermine_parent -> Noner5   zdetermine_parent ->.zrelative importpath too deep)r6   r7   r   r   r#   AssertionErrorcountImportErrorjoinrE   rfind)r   rO   r/   ZpnamerQ   r2   r   r   r   rK      sB    		#	zModuleFinder.determine_parentc             C   s>  |  j  d d | |  d | k rX | j d  } | d  |  } | | d d   } n | } d } | r d | j | f } n | } |  j | | |  } | r |  j d d | | f  | | f S| r| } d  } |  j | | |  } | r|  j d d | | f  | | f Sn  |  j d d |  t d	 |   d  S)
NrU   rL   rV   r5   r:   z%s.%szfind_head_package ->z"raise ImportError: No module namedzNo module named )r6   findr   import_moduler7   rY   )r   rQ   r   r2   headrS   ZqnamerR   r   r   r   rL      s.    
zModuleFinder.find_head_packagec             C   s   |  j  d d | |  | } x | r | j d  } | d k  rO t |  } n  | d  |  | | d d   } } d | j | f } |  j | | |  } | s |  j d d |  t d |   q q W|  j d d	 |  | S)
NrU   rM   rV   r   r5   z%s.%sz"raise ImportError: No module namedzNo module named zload_tail ->)r6   r\   lenr   r]   r7   rY   )r   rR   rS   rT   r2   r^   Zmnamer   r   r   rM      s    	 %zModuleFinder.load_tailc             C   s   |  j  d d | | |  x | D] } | d k ri | s |  j |  } | rf |  j | | d  qf q q  t | |  s  d | j | f } |  j | | |  } | s t d |   q q  q  Wd  S)NrU   rN   *r5   z%s.%szNo module named )r4   find_all_submodulesrN   hasattrr   r]   rY   )r   rT   rP   Z	recursivesuballsubnameZsubmodr   r   r   rN      s    zModuleFinder.ensure_fromlistc       
      C   sB  | j  s d  Si  } g  } | t j j d  d   7} | t j j d  d   7} | t j j d  d   7} x | j  D] } y t j |  } Wn( t k
 r |  j	 d d |  wq Yn Xx| | D]t } d  } xF | D]> } t
 |  }	 | |	 d   | k r | d  |	  } Pq q W| r | d k r | | | <q q Wqq W| j   S)Nr8   zcan't list directoryr   )r   	importlib	machineryEXTENSION_SUFFIXESSOURCE_SUFFIXESBYTECODE_SUFFIXESrD   listdirOSErrorr4   r_   keys)
r   rT   r#   suffixesrG   namesr   modZsuffnr   r   r   ra      s.    	z ModuleFinder.find_all_submodulesc             C   s\  |  j  d d | | |  y |  j | } Wn t k
 r> Yn X|  j d d |  | S| |  j k ry |  j d d  d  S| r | j d  k r |  j d d  d  Sy+ |  j | | o | j |  \ } } } Wn) t k
 r |  j d d d   d  SYn Xz |  j | | | |  } Wd  | r+| j	   n  X| rEt
 | | |  n  |  j d d |  | S)NrI   r]   zimport_module ->zimport_module -> None)r6   r#   KeyErrorr7   r$   r   find_modulerY   r@   closesetattr)r   ZpartnamefqnamerQ   rT   rB   rA   rC   r   r   r   r]      s6    	"	zModuleFinder.import_modulec             C   s  | \ } } } |  j  d d | | o' d |  | t j k rf |  j | |  } |  j d d |  | S| t j k r t | j   d | d  }	 n | t j k ry t	 j
 j | j    }
 WnE t k
 r} z% |  j d d t |  |    WYd  d  } ~ Xn Xt j |
  }	 n d  }	 |  j |  } | | _ |	 rt|  j rX|  j |	  }	 n  |	 | _ |  j |	 |  n  |  j d d |  | S)Nr8   r@   rB   zload_module ->
execzraise ImportError: )r6   r>   ZPKG_DIRECTORYload_packager7   r?   compilereadZPY_COMPILEDrf   
_bootstrap_validate_bytecode_headerrY   r0   marshalloads
add_moduler   r(   replace_paths_in_coder   	scan_code)r   rv   rB   rA   	file_infosuffixmodetyperT   coZmarshal_dataexcr   r   r   r@     s2    			zModuleFinder.load_modulec             C   sQ   | |  j  k r i  |  j  | <n  | r< d |  j  | | j <n d |  j  | d <d  S)Nr5   -)r$   r   )r   r   rO   r   r   r   _add_badmodule5  s
    zModuleFinder._add_badmodulec             C   sP  | |  j  k r# |  j | |  d  Sy |  j | | d | WnN t k
 r } z. |  j d d t |   |  j | |  WYd  d  } ~ Xn X| rLx | D] } | |  j  k r |  j | |  q n  y  |  j | | | g d | Wq t k
 rD} z< |  j d d t |   | d | } |  j | |  WYd  d  } ~ Xq Xq Wn  d  S)Nr/   r8   zImportError:rV   )r$   r   rJ   rY   r4   r0   )r   r   rO   rP   r/   r4   rc   fullnamer   r   r   _safe_import_hook=  s&    # zModuleFinder._safe_import_hookc             c   sk  | j  } | j } | j } t t t } x;| rft | d g  } | t k r | d | d d   \ } d | | f f V| d d   } q, n  | d  d d  | k r4| d | d  d   \ }	 }
 } | |	 } | d k rd | |
 | | f f Vn d	 | | |
 | | f f V| d d   } q, n  | t k rS| d d   } q, | d d   } q, Wd  S)
Nr   z<Hr5   rI   store	   z<xHxHxHabsolute_importrelative_import)co_codeco_names	co_constsr   r   bytes	STORE_OPSHAVE_ARGUMENT)r   r   unpackcodero   constsZLOAD_LOAD_AND_IMPORTcZopargZoparg_1Zoparg_2Zoparg_3r/   r   r   r   scan_opcodes_25T  s,    				"
zModuleFinder.scan_opcodes_25c             C   s<  | j  } |  j } x| |  D]\ } } | d k rP | \ } d | j | <q | d k r{| \ } } d }	 | d  k	 r d | k r d }	 n  d d   | D } n  |  j | | | d d |	 rd  }
 | j r |  j j | j d	 |  }
 n  |
 d  k r|  j j |  }
 n  |
 d  k	 rh| j j |
 j  | j	 j |
 j	  |
 j
 d  k rud | j	 | <quqxd | j	 | <qq | d
 k r| \ } } } | r|  j | | | d | q|  j | d | } |  j | j d  | d d q t |   q Wx9 | j D]. } t | t |   r|  j | |  qqWd  S)Nr   r5   r   r   r`   c             S   s"   g  |  ] } | d  k r |  q S)r`   r   ).0fr   r   r   
<listcomp>~  s   	 z*ModuleFinder.scan_code.<locals>.<listcomp>r/   rV   r   )r   r   r   r   r   r#   getr   updater   r   rK   RuntimeErrorr   
isinstancer   r   )r   r   rT   r   scannerZwhatr1   r   rP   Z	have_starZmmr/   rQ   r   r   r   r   r   q  sH    					 zModuleFinder.scan_codec             C   s   |  j  d d | |  t j |  } | r4 | } n  |  j |  } | | _ | g | _ | j t j | g   | _ |  j d | j  \ } } } z1 |  j | | | |  |  j	 d d |  | SWd  | r | j
   n  Xd  S)Nr8   ry   r   zload_package ->)r6   r   r   r   r   r   r   rs   r@   r7   rt   )r   rv   rA   r   rT   rB   ZbufrC   r   r   r   ry     s    		zModuleFinder.load_packagec             C   s5   | |  j  k r |  j  | St |  |  j  | <} | S)N)r#   r   )r   rv   rT   r   r   r   r     s    zModuleFinder.add_modulec             C   s   | d  k	 r  | j  d | } n | } | |  j k rW |  j d d |  t |   n  | d  k r | t j k r d  d  d d t j f f S|  j } n  t j	 | |  S)NrV   rI   zfind_module -> Excludedr:   )
r   r'   r7   rY   r"   builtin_module_namesr>   Z	C_BUILTINr
   rs   )r   r   r
   rQ   r   r   r   r   rs     s    zModuleFinder.find_modulec             C   s  t    t  d d  t  d d  t |  j j    } xa | D]Y } |  j | } | j rn t  d d d n t  d d d t  d	 | | j p d
  q? W|  j   \ } } | rt    t  d  xF | D]; } t |  j | j    } t  d | d d j |   q Wn  | r~t    t  d d d t  d  xF | D]; } t |  j | j    } t  d | d d j |   q<Wn  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NameFile----Pr*   r+   rT   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)zNamer   )r   r   )	r-   sortedr#   rm   r   r   any_missing_mayber$   rZ   )r   rm   keyrT   missingmayber   Zmodsr   r   r   report  s0    	
#
zModuleFinder.reportc             C   s   |  j    \ } } | | 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 r1 q n  | j d  } | d k  r_ | j |  q n  | | d d  } | d |  } |  j j |  } | d k	 r | |  j  | k r | j |  q| | j k r q| j r | j |  q| j |  q | j |  q W| j   | j   | | 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.
        rV   r   r5   N)	r$   r'   r[   r	   r#   r   r   r   sort)r   r   r   r   r2   re   ZpkgnameZpkgr   r   r   r     s0    		

zModuleFinder.any_missing_maybec             C   s  t  j j | j  } } xD |  j D]9 \ } } | j |  r# | | t |  d   } Pq# q# W|  j r | |  j k r | | k r |  j	 d d | | f  n |  j	 d d | f  |  j j
 |  n  t | j  } xM t t |   D]9 } t | | t |   r |  j | |  | | <q q Wt j | 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_coder   r   )r   r   r    r   r4   r6   r7   r9   rH   rJ   rK   rL   rM   rN   ra   r]   r@   r   r   structr   r   r   ry   r   rs   r   r   r   r   r   r   r   r   r!   H   s2   	#1".r!   c              C   sf  d d  l  }  y) |  j  t j d d   d  \ } } Wn6 |  j k
 rm } z t |  d  SWYd  d  } ~ Xn Xd } d } g  } g  } x | D] \ } }	 | d k r | d } n  | d k r d } n  | d k r | |	 j t j  } n  | d k rd } n  | d k r | j |	  q q W| s0d	 }
 n
 | d }
 t j	 d  d   } t j	 j
 |
  | d <| | } | d k rt d
  x$ | D] } t d t |   qWn  t | | |  } x | d d   D]z } | d k rd } qn  | r:| d d   d k r*| j | d  d  d  d g  qG| j |  q| j |  qW| j |
  | j   | S)Nr   r5   zdmp:qx:z-dz-mz-pz-qz-xzhello.pyzpath:z   r8   z.*r`   r   )getoptr"   argverrorr-   rE   rD   pathsepr	   r
   dirnamer.   r!   rJ   rH   r9   r   )r   Zoptsr1   r4   r%   ZdomodsZaddpathZexcludeoaZscriptr
   itemmfr3   r   r   r   testC  sX    )
			


#
r   r<   z
[interrupted])#__doc__Zdisimportlib._bootstraprf   importlib.machineryr~   rD   r"   r   r   warningscatch_warningssimplefilterPendingDeprecationWarningr>   r   opnameindexr   r   r   r   r   r   r   r   r   r   r   r!   r   r   r   KeyboardInterruptr-   r   r   r   r   <module>   s>    ;