o w[eQ_@s dZddlZddlZddlZddlZddlZddlZddlZej dZ ej dZ ej dZ ej dZ e e fZejZdZdZdZd Zd Zd Zd ZiZd dZiZddZdddZGdddZGdddZddZedkrzeZ WdSe!ye"dYdSwdS)z3Find modules used by a script, using introspection.N LOAD_CONST IMPORT_NAME STORE_NAME STORE_GLOBALcCst|g|dSN)packagePathMap setdefaultappend) packagenamepathr#/usr/lib/python3.10/modulefinder.pyAddPackagePath&srcCs |t|<dSr )replacePackageMap)oldnamenewnamerrrReplacePackage1s rcCstjjtjj||}|durtdj|d|d|jtjjur+ddddt ffS|jtjj ur:ddddt ffS|j }|j |rOdtj|ddtffSt|jtjjrZt}nt|jtjjret}nt|jtjjrpt}nddddtffSt|}tj|d}|||d|ffS)zDAn importlib reimplementation of imp.find_module (for our purposes).NzNo module named {name!r})namerb) importlib machinery PathFinderinvalidate_caches find_spec ImportErrorformatloaderBuiltinImporter _C_BUILTINFrozenImporter _PY_FROZENorigin is_packageosrdirname_PKG_DIRECTORY isinstanceSourceFileLoader _PY_SOURCEExtensionFileLoader _C_EXTENSIONSourcelessFileLoader _PY_COMPILED _SEARCH_ERRORio open_codesplitext)rrspec file_pathkindfilesuffixrrr _find_module5s*   r>c@seZdZdddZddZdS)ModuleNcCs(||_||_||_d|_i|_i|_dSr )__name____file____path____code__ globalnames starimports)selfrr<rrrr__init__ds  zModule.__init__cCsLd|jf}|jdur|d|jf}|jdur |d|jf}|d}|S)Nz Module(%rz, %r))r@rArB)rFsrrr__repr__qs   zModule.__repr__)NN)r@ __module__ __qualname__rGrJrrrrr?bs  r?c@seZdZd6ddZddZddZd d Zd d Zd dZd7ddZ d8ddZ ddZ ddZ d9ddZ ddZddZddZd d!Zd8d"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd:d,d-Zd.d/Zd0d1Zd2d3Zd4d5ZdS); ModuleFinderNrcCsZ|durtj}||_i|_i|_||_d|_|dur|ng|_|dur%|ng|_g|_dS)Nr) sysrmodules badmodulesdebugindentexcludes replace_pathsprocessed_paths)rFrrQrSrTrrrrG|s zModuleFinder.__init__cGsZ||jkr+t|jD]}tdddq t|dd|D] }tt|ddqtdSdS)N  end)rQrangerRprintrepr)rFlevelstrargsiargrrrmsgs   zModuleFinder.msgcGs0|d}||jkr|jd|_|j|dSdSNrrrQrRrbrFr_r]rrrmsgin   zModuleFinder.msgincGs0|d}||jkr|jd|_|j|dSdSrcrdrerrrmsgoutrgzModuleFinder.msgoutcCsX|dd|t|}ddtf}|d|||WddS1s%wYdS)Nr run_scriptrr__main__)rbr6r7r0 load_module)rFpathnamefpstuffrrrris   "zModuleFinder.run_scriptcCsjtj|\}}tj|\}}t|}|dtf}|||||WddS1s.wYdS)Nr)r+rsplitr8r6r7r0rk)rFrldirrextrmrnrrr load_files   "zModuleFinder.load_filerc Cs\|dd|||||j||d}|||\}}|||}|s#|S|jr,|||dS)Nr import_hookr])rbdetermine_parentfind_head_package load_tailrBensure_fromlist) rFrcallerfromlistr]parentqtailmrrrrss  zModuleFinder.import_hookcCsJ|dd|||r|dkr|dddS|j}|dkrb|jr$|d8}|dkr<|j|}||us3J|dd||S|d|krGtdd|dd| }|j|}|dd||S|jry|j|}||uspJ|dd||Sd|vr| d}|d|}|j|}|j|ksJ|dd||S|dddS) Nrurzdetermine_parent -> Nonerzdetermine_parent ->.zrelative importpath too deep) rfrhr@rBrOcountr"joinrorfind)rFryr]pnamer{r`rrrrusB           zModuleFinder.determine_parentcCs|dd||d|vr |d}|d|}||dd}n|}d}|r.d|j|f}n|}||||}|rF|dd||f||fS|rb|}d}||||}|rb|dd||f||fS|dd|td |) Nrrvrrr%s.%szfind_head_package ->"raise ImportError: No module namedNo module named )rffindr@ import_modulerhr")rFr{rr`headr}qnamer|rrrrvs.   zModuleFinder.find_head_packagecCs|dd|||}|rG|d}|dkrt|}|d|||dd}}d|j|f}||||}|sE|dd|td||s |dd ||S) Nrrwrrrrrrz load_tail ->)rfrlenr@rrhr")rFr|r}r~r`rmnamerrrrws   zModuleFinder.load_tailcCs|dd||||D]2}|dkr"|s!||}|r!|||dq t||s=d|j|f}||||}|s=td|q dS)Nrrx*rrr)rbfind_all_submodulesrxhasattrr@rr")rFr~rz recursivesuballsubnamesubmodrrrrxs   zModuleFinder.ensure_fromlistc Cs|jsdSi}g}|tjjdd7}|tjjdd7}|tjjdd7}|jD]F}zt|}WntyC| dd|Yq*w|D])}d}|D]}t |} || d|krd|d| }nqL|ro|dkro|||<qFq*| S)Nrzcan't list directoryrG) rBrrEXTENSION_SUFFIXESSOURCE_SUFFIXESBYTECODE_SUFFIXESr+listdirOSErrorrbrkeys) rFr~rOsuffixesrpnamesrmodsuffnrrrrs6    z ModuleFinder.find_all_submodulescCs|dd|||z|j|}Wn tyYn w|dd||S||jvr0|dddS|r?|jdur?|dddSz|||oG|j|\}}}Wnty_|dddYdSwz|||||}W|rp| n|rx| ww|rt ||||dd||S)Nrrzimport_module ->zimport_module -> None) rfrOKeyErrorrhrPrB find_moduler"rkclosesetattr)rFpartnamefqnamer{r~rmrlrnrrrr,sD        zModuleFinder.import_modulec Cs|\}}}|dd||o d||tkr#|||}|dd||S|tkr0t||d} n9|tkrgz|} tj | |iWnt yZ} z |ddt | |d} ~ wwt t| dd} nd} ||}||_| r|jr{|| } | |_|| ||dd||S)Nrrkrmzload_module ->execzraise ImportError: )rfr- load_packagerhr0compilereadr4r_bootstrap_external _classify_pycr"r^marshalloads memoryview add_modulerArTreplace_paths_in_coderC scan_code) rFrrmrl file_infor=modetyper~codataexcrrrrkLs8     zModuleFinder.load_modulecCs>||jvr i|j|<|rd|j||j<dSd|j|d<dS)Nr-)rPr@)rFrryrrr_add_badmoduleis  zModuleFinder._add_badmodulec CsJ||jvr |||dSz |j|||dWnCty9}z|ddt||||WYd}~dSd}~wtyZ}z|ddt||||WYd}~dSd}~ww|r|D]C}|d|}||jvrs|||q_z |j|||g|dWq_ty}z|ddt||||WYd}~q_d}~wwdSdS)Nrtrz ImportError:z SyntaxError:r)rPrrsr"rbr^ SyntaxError)rFrryrzr]rbrfullnamerrr_safe_import_hookqs:     zModuleFinder._safe_import_hookc cs|j}|j}|j}ddt|D}t|D]`\}\}}|tvr+d||ffVq|tkrx|dkrx||dd||ddkrItkrxnq|||dd} |||dd} | dkrmd| ||ffVn d| | ||ffVqqdS) NcSs"g|] \}}}|tkr||fqSr) EXTENDED_ARG).0_oprarrr sz-ModuleFinder.scan_opcodes..storerrrabsolute_importrelative_import) co_codeco_names co_constsdis_unpack_opargs enumerate STORE_OPSrr) rFrcoderconstsopargsr`ropargr]rzrrr scan_opcodess&0zModuleFinder.scan_opcodescCs||j}|j}||D]\}}|dkr|\}d|j|<q |dkr~|\}}d} |dur6d|vr/d} dd|D}|j|||dd| r}d} |jrQ|j|jd |} | dur[|j|} | durx|j| j|j | j | j durwd|j |<q d|j |<q |d kr|\} }}|r|j|||| dq |j || d} |j| jd|ddq t ||j D]} t| t|r|| |qdS) NrrrrrcSsg|]}|dkr|qS)rr)rfrrrrsz*ModuleFinder.scan_code..rtrr)rrrDrrBrOgetr@updaterErCru RuntimeErrorrr.rr)rFrr~rscannerwhatr_rrz have_starmmr]r{crrrrsP        zModuleFinder.scan_codecCs|dd||t|}|r|}||}||_|g|_|jt|g|_|d|j\}}}z|||||| dd||W|rJ| SS|rR| ww)NrrrGzload_package ->) rfrrrrArBr rrkrhr)rFrrlrr~rmbufrnrrrrs$    zModuleFinder.load_packagecCs*||jvr |j|St||j|<}|Sr )rOr?)rFrr~rrrrs  zModuleFinder.add_modulecCsn|dur |jd|}n|}||jvr|dd|t||dur2|tjvr/ddddtffS|j}t||S)Nrrzfind_module -> Excludedr) r@rSrhr"rNbuiltin_module_namesr&rr>)rFrrr{rrrrrs   zModuleFinder.find_modulecCsttddtddt|j}|D]!}|j|}|jr)tdddntdddtd||jp7d q|\}}|rattd |D]}t|j|}td |d d |qK|rttdddtd|D]}t|j|}td |d d |qrdSdS)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)NameFile)----rPrWrXr~z%-25srzMissing modules:?z imported fromz, z7Submodules that appear to be missing, but could also bez#global names in the parent package:N) r[sortedrOrrBrAany_missing_mayberPr)rFrkeyr~missingmaybermodsrrrreports4      zModuleFinder.reportcCs|\}}||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)rFrrrrr any_missing s zModuleFinder.any_missingcCsg}g}|jD]V}||jvrq|d}|dkr||q||dd}|d|}|j|}|durX||j|vrC||q||jvrIq|jrR||q||q||q||||fS)aReturn 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. rrrN) rPrSrrrOrrDrEsort)rFrrrr`rpkgnamepkgrrrr(s0            zModuleFinder.any_missing_maybecCstj|j}}|jD]\}}||r!||t|d}nq |jrH||jvrH||kr9| dd||fn | dd|f|j |t |j }t t|D]}t||t|rg|||||<qS|jt||dS)Nrzco_filename %r changed to %rz co_filename %r remains unchanged)r co_filename)r+rnormpathrrT startswithrrQrUrhrlistrrZr.rrreplacetuple)rFr new_filenameoriginal_filenamerrrr`rrrrVs*   z"ModuleFinder.replace_paths_in_code)NrNN)NNr)r)rr )r@rKrLrGrbrfrhrirrrsrurvrwrxrrrkrrrrrrrrrrrrrrrrMzs4     #   1 " .rMc Csddl}z|tjddd\}}Wn|jy+}z t|WYd}~dSd}~wwd}d}g}g}|D]-\}} |dkrB|d}|dkrHd}|dkrT|| tj}|dkrZd}|dkrc|| q6|sid } n|d} tj dd} tj | | d<|| } |dkrtd | D] } td t | qt | ||} |ddD]+}|dkrd}q|r|d dd kr| |dd ddgq| |q| |q| | | | S)Nrrzdmp:qx:z-dz-mz-pz-qz-xzhello.pyzpath:rVz.*r)getoptrNargverrorr[ror+pathseprrr,r\rMrsrrrir)roptsr_rbrQdomodsaddpathexcludeoascriptritemmfrarrrtestns^      rrjz [interrupted]r )#__doc__rimportlib._bootstrap_externalrimportlib.machineryrr+r6rNopmaprrrrrrr5r0r4r2r-r&r(r rrrr>r?rMrr@rKeyboardInterruptr[rrrrsN     -w;