o
    fQ_                     @   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)packagenamepath r   #/usr/lib/python3.10/modulefinder.pyAddPackagePath&   s   r   c                 C   s   |t | < d S r   )replacePackageMap)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   spec	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   r<   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@   rA   rB   )rF   sr   r   r   __repr__q   s   

zModule.__repr__)NN)r@   
__module____qualname__rG   rJ   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)rF   r   rQ   rS   rT   r   r   r   rG   |   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)rQ   rangerR   printrepr)rF   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   rQ   rR   rb   rF   r_   r]   r   r   r   msgin   
   
zModuleFinder.msginc                 G   s0   |d }|| j kr| jd | _| j|  d S d S rc   rd   re   r   r   r   msgout   rg   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__)rb   r6   r7   r0   load_module)rF   pathnamefpstuffr   r   r   ri      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   splitr8   r6   r7   r0   rk   )rF   rl   dirr   extrm   rn   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r]   )rb   determine_parentfind_head_package	load_tailrB   ensure_fromlist)	rF   r   callerfromlistr]   parentqtailmr   r   r   rs      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   ru   r   zdetermine_parent -> Noner   zdetermine_parent ->.zrelative importpath too deep)
rf   rh   r@   rB   rO   countr"   joinro   rfind)rF   ry   r]   pnamer{   r`   r   r   r   ru      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   rv   r   r   r   %s.%szfind_head_package ->"raise ImportError: No module namedNo module named )rf   findr@   import_modulerh   r"   )rF   r{   r   r`   headr}   qnamer|   r   r   r   rv      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   rw   r   r   r   r   r   r   zload_tail ->)rf   r   lenr@   r   rh   r"   )rF   r|   r}   r~   r`   r   mnamer   r   r   rw      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   rx   *r   r   r   )rb   find_all_submodulesrx   hasattrr@   r   r"   )rF   r~   rz   	recursivesuballsubnamesubmodr   r   r   rx     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 directoryrG   )rB   r   r   EXTENSION_SUFFIXESSOURCE_SUFFIXESBYTECODE_SUFFIXESr+   listdirOSErrorrb   r   keys)
rF   r~   rO   suffixesrp   namesr   mod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)rf   rO   KeyErrorrh   rP   rB   find_moduler"   rk   closesetattr)rF   partnamefqnamer{   r~   rm   rl   rn   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   rk   rm   zload_module ->execzraise ImportError:    )rf   r-   load_packagerh   r0   compilereadr4   r   _bootstrap_external_classify_pycr"   r^   marshalloads
memoryview
add_modulerA   rT   replace_paths_in_coderC   	scan_code)rF   r   rm   rl   	file_infor=   modetyper~   codataexcr   r   r   rk   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   -)rP   r@   )rF   r   ry   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 )Nrt   r   zImportError:zSyntaxError:r   )rP   r   rs   r"   rb   r^   SyntaxError)rF   r   ry   rz   r]   rb   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_opra   r   r   r   
<listcomp>  s    z-ModuleFinder.scan_opcodes.<locals>.<listcomp>storer   r   r   absolute_importrelative_import)	co_codeco_names	co_constsdis_unpack_opargs	enumerate	STORE_OPSr   r   )rF   r   coder   constsopargsr`   r   opargr]   rz   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>rt   r   r   )r   r   rD   r   rB   rO   getr@   updaterE   rC   ru   RuntimeErrorr   r.   r   r   )rF   r   r~   r   scannerwhatr_   r   rz   	have_starmmr]   r{   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   rG   zload_package ->)rf   r   r   r   rA   rB   r   r   rk   rh   r   )rF   r   rl   r   r~   rm   bufrn   r   r   r   r     s$   



zModuleFinder.load_packagec                 C   s*   || j v r
| j | S t| | j |< }|S r   )rO   r?   )rF   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@   rS   rh   r"   rN   builtin_module_namesr&   r   r>   )rF   r   r   r{   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)NameFile)----r   PrW   rX   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)	r[   sortedrO   r   rB   rA   any_missing_mayberP   r   )rF   r   keyr~   missingmayber   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   )rF   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)	rP   rS   r   r   rO   r   rD   rE   sort)rF   r   r   r   r`   r   pkgname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   rT   
startswithr   rQ   rU   rh   r   listr   rZ   r.   r   r   replacetuple)rF   r   new_filenameoriginal_filenamer   rr   r`   r   r   r   r   V  s*   

z"ModuleFinder.replace_paths_in_code)Nr   NN)NNr   )r   )r   r   )r@   rK   rL   rG   rb   rf   rh   ri   rr   rs   ru   rv   rw   rx   r   r   rk   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rM   z   s4    
	

#
 
1
".rM   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:rV   z.*r   )getoptrN   argverrorr[   ro   r+   pathsepr   r   r,   r\   rM   rs   rr   ri   r   )r   optsr_   rb   rQ   domodsaddpathexcludeoascriptr   itemmfra   r   r   r   testn  s^   

r  rj   z
[interrupted]r   )#__doc__r   importlib._bootstrap_externalr   importlib.machineryr   r+   r6   rN   opmapr   r   r   r   r   r   r5   r0   r4   r2   r-   r&   r(   r   r   r   r   r>   r?   rM   r  r@   r  KeyboardInterruptr[   r   r   r   r   <module>   sN    




-   w;