
bc           @   sl  d  Z  d d l m 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 j d  r d Z n d Z e j d Z e j d Z e j d	 Z e j d
 Z e e f Z e j Z e j Z d   Z i  Z d   Z i  Z d   Z d f  d     YZ d f  d     YZ d   Z e d k rhy e   Z Wn e k
 rdd GHn Xn  d S(   s3   Find modules used by a script, using introspection.i(   t
   generatorsNt   newlinest   Ut   rt
   LOAD_CONSTt   IMPORT_NAMEt
   STORE_NAMEt   STORE_GLOBALc         c   s   d } t  |   } d } x | | k  r t |  |  } | } | d } d  } | t k r t |  |  t |  | d  d | } d } | d } | t k r | d } q n  | | | f Vq Wd  S(   Ni    i   i   i   i   (   t   lent   ordt   Nonet   HAVE_ARGUMENTt   EXTENDED_ARG(   t   codet   extended_argt   nt   it   opt   offsett   arg(    (    s"   /usr/lib/python2.7/modulefinder.pyt   _unpack_opargs   s    
*
c         C   s-   t  j |  g   } | j |  | t  |  <d  S(   N(   t   packagePathMapt   gett   append(   t   packagenamet   patht   paths(    (    s"   /usr/lib/python2.7/modulefinder.pyt   AddPackagePath6   s    c         C   s   | t  |  <d  S(   N(   t   replacePackageMap(   t   oldnamet   newname(    (    s"   /usr/lib/python2.7/modulefinder.pyt   ReplacePackageB   s    t   Modulec           B   s    e  Z d d d   Z d   Z RS(   c         C   s:   | |  _  | |  _ | |  _ d  |  _ i  |  _ i  |  _ d  S(   N(   t   __name__t   __file__t   __path__R
   t   __code__t   globalnamest   starimports(   t   selft   namet   fileR   (    (    s"   /usr/lib/python2.7/modulefinder.pyt   __init__H   s    					c         C   sj   d |  j  f } |  j d  k	 r6 | d |  j f } n  |  j d  k	 r\ | d |  j f } n  | d } | S(   Ns	   Module(%rs   , %rt   )(   R!   R"   R
   R#   (   R'   t   s(    (    s"   /usr/lib/python2.7/modulefinder.pyt   __repr__U   s    
N(   R!   t
   __module__R
   R*   R-   (    (    (    s"   /usr/lib/python2.7/modulefinder.pyR    F   s   t   ModuleFinderc           B   s  e  Z d d  g  g  d  Z d   Z d   Z d   Z d   Z d   Z d d d d  Z	 d d	  Z
 d
   Z d   Z d  d  Z d   Z d   Z d   Z d   Z d d  Z e j d  Z d   Z d   Z d   Z d   Z d d  Z d   Z d   Z d   Z d   Z RS(   i    c         C   sd   | d  k r t j } n  | |  _ i  |  _ i  |  _ | |  _ d |  _ | |  _ | |  _ g  |  _	 d  S(   Ni    (
   R
   t   sysR   t   modulest
   badmodulest   debugt   indentt   excludest   replace_pathst   processed_paths(   R'   R   R3   R5   R6   (    (    s"   /usr/lib/python2.7/modulefinder.pyR*   `   s    							c         G   sT   | |  j  k rP x t |  j  D]
 } d Gq W| Gx | D] } t |  Gq8 WHn  d  S(   Ns      (   R3   t   rangeR4   t   repr(   R'   t   levelt   strt   argsR   R   (    (    s"   /usr/lib/python2.7/modulefinder.pyt   msgl   s    c         G   s=   | d } | |  j  k r9 |  j d |  _ |  j |   n  d  S(   Ni    i   (   R3   R4   R=   (   R'   R<   R:   (    (    s"   /usr/lib/python2.7/modulefinder.pyt   msginu   s    
c         G   s=   | d } | |  j  k r9 |  j d |  _ |  j |   n  d  S(   Ni    i   (   R3   R4   R=   (   R'   R<   R:   (    (    s"   /usr/lib/python2.7/modulefinder.pyt   msgout{   s    
c      	   C   sW   |  j  d d |  t | t  / } d d t j f } |  j d | | |  Wd  QXd  S(   Ni   t
   run_scriptt    R   t   __main__(   R=   t   opent	   READ_MODEt   impt	   PY_SOURCEt   load_module(   R'   t   pathnamet   fpt   stuff(    (    s"   /usr/lib/python2.7/modulefinder.pyR@      s    c      	   C   st   t  j j |  \ } } t  j j |  \ } } t | t  / } | d t j f } |  j | | | |  Wd  QXd  S(   NR   (	   t   osR   t   splitt   splitextRC   RD   RE   RF   RG   (   R'   RH   t   dirR(   t   extRI   RJ   (    (    s"   /usr/lib/python2.7/modulefinder.pyt	   load_file   s
    ic   	      C   s   |  j  d d | | | |  |  j | d | } |  j | |  \ } } |  j | |  } | se | S| j r |  j | |  n  d  S(   Ni   t   import_hookR:   (   R=   t   determine_parentt   find_head_packaget	   load_tailR#   t   ensure_fromlistR
   (	   R'   R(   t   callert   fromlistR:   t   parentt   qt   tailt   m(    (    s"   /usr/lib/python2.7/modulefinder.pyRQ      s    	c         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  |   } |  j | } |  j d d |  | S| j rK|  j | } | | k s4t  |  j d d |  | Sd | k r| j d  } | |  } |  j | } | j | k st  |  j d d |  | S|  j d d  d  S(	   Ni   RR   i    s   determine_parent -> Nonei   s   determine_parent ->t   .s   relative importpath too deep(   R>   R?   R
   R!   R#   R1   t   AssertionErrort   countt   ImportErrort   joinRL   t   rfind(   R'   RV   R:   t   pnameRX   R   (    (    s"   /usr/lib/python2.7/modulefinder.pyRR      sB    			
c         C   s/  |  j  d d | |  d | k rL | j d  } | |  } | | d } n | } d } | rt 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(
   Ni   RS   R\   i   RA   s   %s.%ss   find_head_package ->s"   raise ImportError: No module nameds   No module named (   R>   t   findR!   t   import_moduleR?   R
   R_   (   R'   RX   R(   R   t   headRZ   t   qnameRY   (    (    s"   /usr/lib/python2.7/modulefinder.pyRS      s.    

c         C   s   |  j  d d | |  | } x | r | j d  } | d k  rO t |  } n  | |  | | d } } d | j | f } |  j | | |  } | s |  j d d |  t d |  q q W|  j d d	 |  | S(
   Ni   RT   R\   i    i   s   %s.%ss"   raise ImportError: No module nameds   No module named s   load_tail ->(   R>   Rc   R   R!   Rd   R?   R_   (   R'   RY   RZ   R[   R   Re   t   mname(    (    s"   /usr/lib/python2.7/modulefinder.pyRT      s    	 c         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(   Ni   RU   t   *i   s   %s.%ss   No module named (   R=   t   find_all_submodulesRU   t   hasattrR!   Rd   R_   (   R'   R[   RW   t	   recursivet   subt   allt   subnamet   submod(    (    s"   /usr/lib/python2.7/modulefinder.pyRU      s    c         C   s  | j  s d  Si  } g  } x% t j   D] } | j | d  q& Wx | j  D] } y t j |  } Wn* t j k
 r |  j d d |  qK n Xxp | D]h } d  } x: | D]2 }	 t	 |	  }
 | |
 |	 k r | |
  } Pq q W| r | d k r | | | <q q WqK W| j
   S(   Ni    i   s   can't list directoryR*   (   R#   RE   t   get_suffixesR   RK   t   listdirt   errorR=   R
   R   t   keys(   R'   R[   R1   t   suffixest   tripleRN   t   namesR(   t   modt   suffR   (    (    s"   /usr/lib/python2.7/modulefinder.pyRi      s,    	c         C   sW  |  j  d d | | |  y |  j | } Wn t k
 r= n X|  j d d |  | S| |  j k rx |  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  SXz |  j	 | | | |  } Wd  | r&| j
   n  X| r@t | | |  n  |  j d d |  | S(   Ni   Rd   s   import_module ->s   import_module -> None(   R>   R1   t   KeyErrorR?   R2   R
   R#   t   find_moduleR_   RG   t   closet   setattr(   R'   t   partnamet   fqnameRX   R[   RI   RH   RJ   (    (    s"   /usr/lib/python2.7/modulefinder.pyRd     s6    	" c   
      C   sr  | \ } } } |  j  d d | | o' d |  | t j k rf |  j | |  } |  j d d |  | S| t j k r t | j   d | d  }	 nr | t j k r | j d  t j	   k r |  j d d |  t
 d	 |  n  | j d  t j |  }	 n d  }	 |  j |  } | | _ |	 r[|  j r?|  j |	  }	 n  |	 | _ |  j |	 |  n  |  j d d |  | S(
   Ni   RG   RI   s   load_module ->s   
t   execi   s#   raise ImportError: Bad magic numbers   Bad magic number in %s(   R>   RE   t   PKG_DIRECTORYt   load_packageR?   RF   t   compilet   readt   PY_COMPILEDt	   get_magicR_   t   marshalt   loadR
   t
   add_moduleR"   R6   t   replace_paths_in_codeR$   t	   scan_code(
   R'   R~   RI   RH   t	   file_infot   suffixt   modet   typeR[   t   co(    (    s"   /usr/lib/python2.7/modulefinder.pyRG   -  s0    			c         C   sQ   | |  j  k r i  |  j  | <n  | r< d |  j  | | j <n d |  j  | d <d  S(   Ni   t   -(   R2   R!   (   R'   R(   RV   (    (    s"   /usr/lib/python2.7/modulefinder.pyt   _add_badmoduleH  s
    c         C   s,  | |  j  k r# |  j | |  d  Sy |  j | | d | Wn< t k
 r{ } |  j d d t |   |  j | |  n X| r(x | D] } | |  j  k r |  j | |  q n  y  |  j | | | g d | Wq t k
 r } |  j d d t |   | d | } |  j | |  q Xq Wn  d  S(   NR:   i   s   ImportError:R\   (   R2   R   RQ   R_   R=   R;   (   R'   R(   RV   RW   R:   R=   Rl   t   fullname(    (    s"   /usr/lib/python2.7/modulefinder.pyt   _safe_import_hookP  s&     c         c   s  | j  } | j } | j } g  t |  D]' \ } } } | t k r( | | f ^ q( }	 x t |	  D] \ }
 \ } } t t k r d | | f f Vqb n  | t k rb |
 d k rb |	 |
 d d t	 k rb | |	 |
 d d } d | | | f f Vqb qb qb Wd  S(   Nt   storei   i    t   import(
   t   co_codet   co_namest	   co_constsR   R   t	   enumeratet   ct	   STORE_OPSR   R   (   R'   R   t   unpackR   Rv   t   constst   _R   R   t   opargsR   t   opargRW   (    (    s"   /usr/lib/python2.7/modulefinder.pyt   scan_opcodesg  s    			c         c   s~  | j  } | j } | j } g  t |  D]' \ } } } | t k r( | | f ^ q( } x"t |  D]\ }	 \ } }
 | t k r d | |
 f f Vqb n  | t k rb |	 d k rb | |	 d d | |	 d d k o t k n rb | | |	 d d } | | |	 d d } | d k r4d | | |
 f f Vqb | d k rXd | | |
 f f Vqb d | | | |
 f f Vqb qb qb Wd  S(	   NR   i   i   i    iR   t   absolute_importt   relative_import(	   R   R   R   R   R   R   R   R   R   (   R'   R   R   Rv   R   R   R   R   R   R   R   R:   RW   (    (    s"   /usr/lib/python2.7/modulefinder.pyt   scan_opcodes_25z  s&    			4c         C   s  | j  } t j d k r$ |  j } n	 |  j } x| |  D]\ } } | d k rk | \ } d | j | <q: | d k r| \ } } d }	 | d  k	 r d | k r d }	 n  g  | D] }
 |
 d k r |
 ^ q } n  | d k r d } n d	 } |  j | | | d
 | |	 r@d  } | j r;|  j	 j
 | j d |  } n  | d  k r\|  j	 j
 |  } n  | d  k	 r| j j | j  | j j | j  | j d  k rd | j | <qqd | j | <q@q: | d k r4| \ } } } | r |  j | | | d
 | q@|  j | d
 | } |  j | j d  | d
 d q: t |   q: Wx9 | j D]. } t | t |   rN|  j | |  qNqNWd  S(   Ni   i   R   i   R   R   i    Rh   iR:   R\   R   (   i   i   (   R   R   (   R   R0   t   version_infoR   R   R%   R
   R   R#   R1   R   R!   t   updateR&   R$   RR   t   RuntimeErrorR   t
   isinstanceR   R   (   R'   R   R[   R   t   scannert   whatR<   R(   RW   t	   have_start   fR:   t   mmRX   R   (    (    s"   /usr/lib/python2.7/modulefinder.pyR     sR    				( 		 c         C   s   |  j  d d | |  t j |  } | r4 | } n  |  j |  } | | _ | g | _ | j t j | g   | _ |  j d | j  \ } } } |  j | | | |  |  j	 d d |  | r | j
   n  | S(   Ni   R   R*   s   load_package ->(   R>   R   R   R   R"   R#   R   Rz   RG   R?   R{   (   R'   R~   RH   R   R[   RI   t   bufRJ   (    (    s"   /usr/lib/python2.7/modulefinder.pyR     s    		c         C   s5   | |  j  k r |  j  | St |  |  j  | <} | S(   N(   R1   R    (   R'   R~   R[   (    (    s"   /usr/lib/python2.7/modulefinder.pyR     s    c         C   s   | d  k	 r  | j d | } n | } | |  j k rT |  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(   NR\   i   s   find_module -> ExcludedRA   (   R
   R!   R5   R?   R_   R0   t   builtin_module_namesRE   t	   C_BUILTINR   Rz   (   R'   R(   R   RX   R   (    (    s"   /usr/lib/python2.7/modulefinder.pyRz     s    c         C   s<  Hd d GHd d GH|  j  j   } | j   xE | D]= } |  j  | } | j rV d Gn d Gd | G| j pn d GHq3 W|  j   \ } } | r Hd	 GHxH | D]= } |  j | j   } | j   d
 G| Gd Gd j |  GHq Wn  | r8Hd Gd GHxH | D]= } |  j | j   } | j   d
 G| Gd Gd j |  GHq Wn  d S(   s   Print a report to stdout, listing the found modules with their
        paths, as well as modules that are missing, or seem to be missing.
        s
     %-25s %st   Namet   Files   ----t   PR[   s   %-25sRA   s   Missing modules:t   ?s   imported froms   , s7   Submodules that appear to be missing, but could also bes#   global names in the parent package:N(   R   R   (   s   ----s   ----(   R1   Rs   t   sortR#   R"   t   any_missing_maybeR2   R`   (   R'   Rs   t   keyR[   t   missingt   maybeR(   t   mods(    (    s"   /usr/lib/python2.7/modulefinder.pyt   report  s6    		
	
!
c         C   s   |  j    \ } } | | S(   s   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   (    (    s"   /usr/lib/python2.7/modulefinder.pyt   any_missing  s    c         C   s"  g  } g  } x |  j  D] } | |  j k r1 q n  | j d  } | d k  r_ | j |  q n  | | 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(   s  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\   i    i   N(
   R2   R5   Ra   R   R1   R   R
   R%   R&   R   (   R'   R   R   R(   R   Rn   t   pkgnamet   pkg(    (    s"   /usr/lib/python2.7/modulefinder.pyR     s0    	
	

c         C   s  t  j j | j  } } x> |  j D]3 \ } } | j |  r# | | t |  } 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 t |  | j | j | | j | j | j | j | j  S(   Ni   s   co_filename %r changed to %rs    co_filename %r remains unchanged(    RK   R   t   normpatht   co_filenameR6   t
   startswithR   R3   R7   R?   R   t   listR   R8   R   R   R   t   typest   CodeTypet   co_argcountt
   co_nlocalst   co_stacksizet   co_flagsR   t   tupleR   t   co_varnamest   co_namet   co_firstlinenot	   co_lnotabt   co_freevarst   co_cellvars(   R'   R   t   new_filenamet   original_filenameR   R   R   R   (    (    s"   /usr/lib/python2.7/modulefinder.pyR   L  s*    N(   R!   R.   R
   R*   R=   R>   R?   R@   RP   RQ   RR   RS   RT   RU   Ri   Rd   RG   R   R   t   structR   R   R   R   R   R   Rz   R   R   R   R   (    (    (    s"   /usr/lib/python2.7/modulefinder.pyR/   ^   s4   						#								6			%		.c          C   s"  d d  l  }  y# |  j  t j d d  \ } } Wn |  j k
 rM } | GHd  SXd } 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 rm | j |	  qm qm W| sd
 }
 n
 | d }
 t j } t j j	 |
  | d <| | } | d k rxd GHx  | D] } d Gt
 |  GHq\Wn  t | | |  } xz | d D]n } | d k rd } qn  | r| d d k r| j | d  d  d g  q| j |  q| j |  qW| j |
  | j   | S(   Nii   s   dmp:qx:i    s   -ds   -ms   -ps   -qs   -xs   hello.pys   path:s      is   .*Rh   (   t   getoptR0   t   argvRr   RL   RK   t   pathsepR   R   t   dirnameR9   R/   RQ   R
   RP   R@   R   (   R   t   optsR<   R=   R3   t   domodst   addpatht   excludet   ot   at   scriptR   t   itemt   mfR   (    (    s"   /usr/lib/python2.7/modulefinder.pyt   testh  sX    #			



RB   s   
[interrupt](    t   __doc__t
   __future__R    t   disRE   R   RK   R0   R   R   Rj   t
   __stdout__RD   t   opmapR   R   R   R   R   R   R   R   R   R   R   R   R    R/   R   R!   R   t   KeyboardInterrupt(    (    (    s"   /usr/lib/python2.7/modulefinder.pyt   <module>   sB   						  	;