o
     JAfQ_                     @   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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rze Z W dS  e!y   e"d Y dS w 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.10/modulefinder.pyAddPackagePath&   s   r   c                 C   s   |t | < d S r   )replacePackageMap)Zoldnamenewnamer   r   r   ReplacePackage1   s   r   c                 C   s  t jj  t jj| |}|du rtdj| d| d|jt jju r+ddddt	ffS |jt jj
u r:ddddtffS |j}|j| rOdtj|ddtffS t|jt jjrZt}nt|jt jjret}nt|jt jjrpt}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_pathkindfilesuffixr   r   r   _find_module5   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   r9   r   r   r   r   __init__d   s   
zModule.__init__c                 C   sL   d| j f }| jd ur|d| jf  }| jd ur |d| jf  }|d }|S )Nz	Module(%rz, %r))r=   r>   r?   )rC   sr   r   r   __repr__q   s   

zModule.__repr__)NN)r=   
__module____qualname__rD   rG   r   r   r   r   r<   b   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d8d"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 u rt j}|| _i | _i | _|| _d| _|d ur|ng | _|d ur%|ng | _g | _d S )Nr   )	sysr   modules
badmodulesdebugindentexcludesreplace_pathsprocessed_paths)rC   r   rN   rP   rQ   r   r   r   rD   |   s   
zModuleFinder.__init__c                 G   sZ   || j kr+t| jD ]}tddd q
t|dd |D ]
}tt|dd qt  d S d S )N    end)rN   rangerO   printrepr)rC   levelstrargsiargr   r   r   msg   s   

zModuleFinder.msgc                 G   s0   |d }|| j kr| jd | _| j|  d S d S Nr   r   rN   rO   r_   rC   r\   rZ   r   r   r   msgin   
   
zModuleFinder.msginc                 G   s0   |d }|| j kr| jd | _| j|  d S d S r`   ra   rb   r   r   r   msgout   rd   zModuleFinder.msgoutc                 C   sX   |  dd| t|}ddtf}| d||| W d    d S 1 s%w   Y  d S )Nr   
run_scriptr   r   __main__)r_   r4   r5   r.   load_module)rC   pathnamefpstuffr   r   r   rf      s
   
"zModuleFinder.run_scriptc                 C   sj   t j|\}}t j|\}}t|}|dtf}| |||| W d    d S 1 s.w   Y  d S )Nr   )r)   r   splitr6   r4   r5   r.   rh   )rC   ri   dirr   extrj   rk   r   r   r   	load_file   s   
"zModuleFinder.load_filer   c           	      C   s\   |  dd|||| | j||d}| ||\}}| ||}|s#|S |jr,| || d S )Nr   import_hookrZ   )r_   determine_parentfind_head_package	load_tailr?   ensure_fromlist)	rC   r   callerfromlistrZ   parentqtailmr   r   r   rp      s   zModuleFinder.import_hookc                 C   sJ  |  dd|| |r|dkr| dd d S |j}|dkrb|jr$|d8 }|dkr<| j| }||u s3J | dd| |S |d|k rGtdd|dd |  }| j| }| dd| |S |jry| j| }||u spJ | dd| |S d|v r|	d}|d | }| j| }|j|ksJ | dd| |S | dd d S )	N   rr   r   zdetermine_parent -> Noner   zdetermine_parent ->.zrelative importpath too deep)
rc   re   r=   r?   rL   countr    joinrl   rfind)rC   rv   rZ   Zpnamerx   r]   r   r   r   rr      sB   




zModuleFinder.determine_parentc                 C   s   |  dd|| d|v r |d}|d | }||d d  }n|}d}|r.d|j|f }n|}| |||}|rF| dd||f ||fS |rb|}d }| |||}|rb| dd||f ||fS | dd| td	| )
Nr|   rs   r}   r   r   %s.%szfind_head_package ->"raise ImportError: No module namedNo module named )rc   findr=   import_modulere   r    )rC   rx   r   r]   headrz   Zqnamery   r   r   r   rs      s.   
zModuleFinder.find_head_packagec                 C   s   |  dd|| |}|rG|d}|dk rt|}|d | ||d d  }}d|j|f }| |||}|sE| dd| td| |s| dd	| |S )
Nr|   rt   r}   r   r   r   r   r   zload_tail ->)rc   r   lenr=   r   re   r    )rC   ry   rz   r{   r]   r   Zmnamer   r   r   rt      s   
	zModuleFinder.load_tailc                 C   s   |  dd||| |D ]2}|dkr"|s!| |}|r!| ||d qt||s=d|j|f }| |||}|s=td| qd S )Nr|   ru   *r   r   r   )r_   find_all_submodulesru   hasattrr=   r   r    )rC   r{   rw   	recursivesuballsubnameZsubmodr   r   r   ru     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 ]F}zt|}W n tyC   | 	dd| Y q*w |D ])}d }|D ]}t
|}	||	 d  |krd|d |	  } nqL|ro|dkro|||< qFq*| S )Nr   zcan't list directoryrD   )r?   r   r   EXTENSION_SUFFIXESSOURCE_SUFFIXESBYTECODE_SUFFIXESr)   listdirOSErrorr_   r   keys)
rC   r{   rL   suffixesrm   namesr   modZsuffnr   r   r   r     s6   
	z ModuleFinder.find_all_submodulesc                 C   s  |  dd||| z| j| }W n	 ty   Y n
w | dd| |S || jv r0| dd d S |r?|jd u r?| dd d S z| ||oG|j|\}}}W n ty_   | ddd  Y d S w z| ||||}W |rp|	  n|rx|	  w w |rt
||| | dd| |S )Nr   r   zimport_module ->zimport_module -> None)rc   rL   KeyErrorre   rM   r?   find_moduler    rh   closesetattr)rC   Zpartnamefqnamerx   r{   rj   ri   rk   r   r   r   r   ,  sD   


zModuleFinder.import_modulec              
   C   s  |\}}}|  dd||od| |tkr#| ||}| dd| |S |tkr0t| |d}	n9|tkrgz| }
tj	
|
|i  W n tyZ } z| ddt| |  d }~ww tt|
dd  }	nd }	| |}||_|	r| jr{| |	}	|	|_| |	| | dd| |S )Nr   rh   rj   zload_module ->execzraise ImportError:    )rc   r+   load_packagere   r.   compilereadr2   r   _bootstrap_external_classify_pycr    r[   marshalloads
memoryview
add_moduler>   rQ   replace_paths_in_coder@   	scan_code)rC   r   rj   ri   	file_infor:   modetyper{   codataexcr   r   r   rh   L  s8   


zModuleFinder.load_modulec                 C   s>   || j vr
i | j |< |rd| j | |j< d S d| j | d< d S )Nr   -)rM   r=   )rC   r   rv   r   r   r   _add_badmodulei  s
   

zModuleFinder._add_badmodulec                 C   sJ  || j v r| || d S z
| j|||d W nC ty9 } z| ddt| | || W Y d }~d S d }~w tyZ } z| ddt| | || W Y d }~d S d }~ww |r|D ]C}|d | }|| j v rs| || q_z| j|||g|d W q_ ty } z| ddt| | || W Y d }~q_d }~ww d S d S )Nrq   r   zImportError:zSyntaxError:r}   )rM   r   rp   r    r_   r[   SyntaxError)rC   r   rv   rw   rZ   r_   r   fullnamer   r   r   _safe_import_hookq  s:   

zModuleFinder._safe_import_hookc                 c   s    |j }|j}|j}dd t|D }t|D ]`\}\}}|tv r+d|| ffV  q|tkrx|dkrx||d  d ||d  d   krItkrxn q|||d  d  }	|||d  d  }
|	dkrmd|
|| ffV  n
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   )rC   r   coder   constsZopargsr]   r   ZopargrZ   rw   r   r   r   scan_opcodes  s&   0zModuleFinder.scan_opcodesc                 C   s|  |j }| j}||D ]\}}|dkr|\}d|j|< q
|dkr~|\}}d}	|d ur6d|v r/d}	dd |D }| j|||dd |	r}d }
|jrQ| j|jd	 | }
|
d u r[| j|}
|
d urx|j|
j |j	|
j	 |
j
d u rwd|j	|< q
d|j	|< q
|d
kr|\}}}|r| j||||d q
| j||d}| j|jd |dd q
t||jD ]}t|t|r| || qd 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>rq   r}   r   )r   r   rA   r   r?   rL   getr=   updaterB   r@   rr   RuntimeErrorr   r,   r   r   )rC   r   r{   r   scannerZwhatr\   r   rw   Z	have_starZmmrZ   rx   cr   r   r   r     sP   




zModuleFinder.scan_codec                 C   s   |  dd|| t|}|r|}| |}||_|g|_|jt|g  |_| d|j\}}}z| |||| | 	dd| |W |rJ|
  S S |rR|
  w w )Nr   r   rD   zload_package ->)rc   r   r   r   r>   r?   r   r   rh   re   r   )rC   r   ri   r   r{   rj   bufrk   r   r   r   r     s$   



zModuleFinder.load_packagec                 C   s*   || j v r
| j | S t| | j |< }|S r   )rL   r<   )rC   r   r{   r   r   r   r     s   

zModuleFinder.add_modulec                 C   sn   |d ur|j d | }n|}|| jv r| dd| t||d u r2|tjv r/d d ddtffS | j}t||S )Nr}   r   zfind_module -> Excludedr   )	r=   rP   re   r    rK   builtin_module_namesr$   r   r;   )rC   r   r   rx   r   r   r   r   r     s   


zModuleFinder.find_modulec                 C   s  t   t dd  t dd  t| j }|D ]!}| j| }|jr)t ddd nt ddd t d| |jp7d	 q|  \}}|rat   t d
 |D ]}t| j|  }t d|dd| qK|rt   t ddd t d |D ]}t| j|  }t d|dd| qrdS 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)----r   PrT   rU   r{   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)	rX   sortedrL   r   r?   r>   any_missing_mayberM   r   )rC   r   keyr{   missingmayber   Zmodsr   r   r   report  s4   
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   )rC   r   r   r   r   r   any_missing   s   zModuleFinder.any_missingc                 C   s   g }g }| j D ]V}|| jv rq|d}|dk r|| q||d d }|d| }| j|}|durX|| j | v rC|| q||jv rIq|jrR|| 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.
        r}   r   r   N)	rM   rP   r   r   rL   r   rA   rB   sort)rC   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   } nq| jrH|| jvrH||kr9| 	dd||f  n	| 	dd|f  | j
| t|j}tt|D ]}t|| t|rg| || ||< qS|jt||dS )Nr   zco_filename %r changed to %rz co_filename %r remains unchanged)r   co_filename)r)   r   normpathr   rQ   
startswithr   rN   rR   re   r   listr   rW   r,   r   r   replacetuple)rC   r   Znew_filenameZoriginal_filenamer   rr   r]   r   r   r   r   V  s*   

z"ModuleFinder.replace_paths_in_code)Nr   NN)NNr   )r   )r   r   )r=   rH   rI   rD   r_   rc   re   rf   ro   rp   rr   rs   rt   ru   r   r   rh   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rJ   z   s4    
	

#
 
1
".rJ   c               
   C   s  dd l } z|  tjdd  d\}}W n | jy+ } zt| W Y d }~d S d }~ww d}d}g }g }|D ]-\}}	|dkrB|d }|dkrHd}|dkrT||	tj }|dkrZd}|dkrc||	 q6|sid	}
n|d }
tj	d d  }tj	
|
|d< || }|dkrtd
 |D ]	}tdt| qt|||}|dd  D ]+}|dkrd}q|r|dd  dkr||d d d dg q|| q|| q||
 |  |S )Nr   r   zdmp:qx:z-dz-mz-pz-qz-xzhello.pyzpath:rS   z.*r   )getoptrK   argverrorrX   rl   r)   pathsepr   r   r*   rY   rJ   rp   ro   rf   r   )r   Zoptsr\   r_   rN   ZdomodsZaddpathZexcludeoaZscriptr   itemmfr^   r   r   r   testn  s^   

r   rg   z
[interrupted]r   )#__doc__r   Zimportlib._bootstrap_externalr   importlib.machineryr   r)   r4   rK   Zopmapr   r   r   r   r   r   r3   r.   r2   r0   r+   r$   r&   r   r   r   r   r;   r<   rJ   r   r=   r   KeyboardInterruptrX   r   r   r   r   <module>   sN    




-   w;