o
    *jv                     @   s  d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlZd dl	m	Z	 d dl
mZ d dlmZ d dlmZ d dlZd dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZ d dlm Z m!Z! d d	l"m#Z# d d
l$m%Z% ee&Z'dZ(e') j*d Z+e# Z,dZ-ddgZ.g dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ=dZ>d Z?d!Z@d"ZAd#ZBd$d% ZCeC ZDG d&d' d'eEZFG d(d) d)eEZGeG ZHd*eIdeeJef d+dfd,d-ZKd?d/d0ZLd@d1d2ZMd3d4 ZNd5d6 ZOdd.e,e0fd7d8ZPdAd9d:ZQdBd;d<ZReSd=krePdd>ZTeUeT dS dS )C    N)datetime)reduce)Path)Union)version)CustomDatasetsHeadsHooksLR_SchedulersMetricsModels
Optimizers	PipelinesPreprocessors
TaskModelsTrainers)FieldsTasks)get_modelscope_cache_dir)default_groupT   Zregister_module
modelscope.)modelsZmetricsZ	pipelinesZpreprocessorsZtrainersZ
msdatasetsZ	exportersZast_indexerZ
decoratorsexpressZfrom_importsZimportsfilepathZmodelscope_pathr   md5indexfiles_mtimerequirementsmodule
class_nameZ	group_keymodule_nameZ
module_clsTEMPLATE_PATHzast_index_file.pyc                  C   s   t d} | t j | S )Nzmodelscope.ast)logging	getLoggersetLevelINFO)Z
ast_logger r(   [/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/utils/ast_utils.pyget_ast_logger;   s   
r*   c                	   @   s&  e Zd Zd)ddZdedefddZdejdefdd	Z	de
ejd
f defddZd*dejdedefddZd*dejdedefddZdd Zde
ejdef fddZ		d+de
ejdef dededefddZdejdefddZdd Zd ed!edefd"d#Zd$edefd%d&Zd'd( ZdS ),AstScanningreturnNc                 C       t  | _t  | _g | _g | _d S N)dictresult_importresult_from_importresult_decoratorr   selfr(   r(   r)   __init__F      
zAstScanning.__init__nodec                 C   s   t |tjot |tj S r.   )
isinstanceastASTexpr_contextr4   r7   r(   r(   r)   _is_sub_nodeL   s
   zAstScanning._is_sub_nodec                 C   sT   |j D ]$}t||}| |r dS t|ttfr'|D ]}| |r&  dS qqdS )NFT)_fieldsgetattrr=   r8   listtuple)r4   r7   fieldattrvalr(   r(   r)   _is_leafP   s   



zAstScanning._is_leafstrc                 C   s"   t rt|jdks|dkrdS dS )NFunctionDefTF)SKIP_FUNCTION_SCANNINGtype__name__r<   r(   r(   r)   _skip_function\   s   zAstScanning._skip_functionTnshow_offsetsc                 C   s   |r|j |j S |jS r.   )_attributesr>   )r4   rL   rM   r(   r(   r)   r>   b   s   zAstScanning._fieldsc                 C   s^   t  }t|tjr-t  }| j||dD ]}| jt|||d}|||< q||t|j< |S |S )NrM   )	r/   r8   r9   r:   r>   _leafr?   rI   rJ   )r4   r7   rM   outputZ
local_dictrB   Zfield_outputr(   r(   r)   rP   h   s   

zAstScanning._leafc                 C   r-   r.   )r/   r0   r1   r2   result_expressr3   r(   r(   r)   _refreshu   r6   zAstScanning._refreshc                 C   s   |    | j|ddd d S )Nz  F)indentrM   )Z_setup_globalscan_importr<   r(   r(   r)   scan_ast{   s   zAstScanning.scan_ast parent_node_namec                    s  |d u r|S   |r j|dS 	ddttjd tf dtdtf fdd}t }t|jdkrat	|d	}|d
krad
dg| }t|d	d t	|d}|d u rYt|d| nt|d||   j|dD ]U}	t	||	}
|
g kryg ||	< n| |rqht|
trt|
d
krt|
d tjr  |
d r||
d }|||	< nQt|
trt }|
D ].}||t|j}t|j}|dks|dks|dks|dkr||vrg ||< || | q|||	< nt|
tjr||
}|||	< n|
||	< t|jdkst|jdkrt|jdkrX|	dkrt  j||	 < |	dkrXt||	 d trHg }||	 d D ]}|d d }|| q1| j|d < n||	 d d }|g j|d < t|jdkr||	 d }t|tr~|D ]}|d  j|d d < qnn| j||	 d d < d|	kr|
g kr|
D ]
}t|t|j q j|
 |
g krt|
jdkr|dkr j|
 qht jt jt jt jiS )NrO   rW   elrX   r,   c                    s    j | |dS )N)rM   rX   )rU   )rY   rX   r4   rM   r(   r)   _scan_import   s
   z-AstScanning.scan_import.<locals>._scan_import
ImportFromlevelr   r   r   r    Importnamesaliasnamedecorator_listCallExpr)rW   )rE   rP   r   r9   r:   rF   r/   rI   rJ   r?   joinsetattrr>   rK   r8   r@   lenappendr1   r0   
CLASS_NAMEra   r2   extendrR   
IMPORT_KEYFROM_IMPORT_KEYDECORATOR_KEYEXPRESS_KEY)r4   r7   rM   rX   r[   Zoutputsr]   Z
path_levelr"   rB   rC   Z	local_outZel_dictrY   ra   rQ   Z	item_nameitemZ
local_nameZ
final_dictr(   rZ   r)   rU      s   














zAstScanning.scan_importc                    sj   dt jdtfdd dtdtf fdd}dt jdtf fdd	} |j}||j}||j}|||fS )
Nr7   r,   c                 S   sV   d\}}}t | jdkrt| d}t|d}t| d}t | jdkr't| d}||fS )N)NNN	AttributevalueidrC   Name)rI   rJ   r?   )r7   rq   rr   rC   r(   r(   r)   _get_attribute_item   s   




z9AstScanning._parse_decorator.<locals>._get_attribute_itemnodesc                    s`   g }| D ])}t |jdkr||jd f qt |jdkr&||jd f q| | q|S )NStrConstant)rI   rJ   rh   srq   )ru   resultr7   rt   r(   r)   _get_args_name   s   z4AstScanning._parse_decorator.<locals>._get_args_namec                    s   g }| D ]C}t |jdkrGt|d}t |jdkr&|t|d|jd f qt |jdkr:|t|d|jd f q|t|df |  q|S )Nkeywordrq   rv   argrw   )rI   rJ   r?   rh   rx   rq   )ru   ry   r7   Zattribute_noderz   r(   r)   _get_keyword_name   s&   
z7AstScanning._parse_decorator.<locals>._get_keyword_name)r9   r:   rA   r@   funcargskeywords)r4   r7   r{   r~   	functions	args_listkeyword_listr(   rz   r)   _parse_decorator   s   




zAstScanning._parse_decoratorc                 C   sH   |d u rd S |dkrt S |d}t|dkr|S tt|d |d S )Nr   r   r   r   )r   splitrg   r?   eval)r4   Zkey_itemZ
split_listr(   r(   r)   _get_registry_value  s   
zAstScanning._get_registry_valueparsed_inputr!   c                 C   s  |\}}}t |d krdS |d g}t|dkr#t|dkr#|t t|dkr4t|dkr4|| t|dkrbt|dkrbd}|D ]}|\}	}
}|	tkrX||
|f |}qD|durb|| t|dkrm|t |D ]}|\}	}
}|	tkr}|
}qo||
|f qo|D ]-}|du r|d q|d du r||d  qt|tr|| q|d	| q|d | 
|d | 
|d fS )zformat registry information to a tuple indexer

        Return:
            tuple: (MODELS, Tasks.text-classification, Models.structbert)
        r   Nr   r      )REGISTER_MODULErg   rh   r   	GROUP_KEYremove
MODULE_CLSr8   rF   re   r   )r4   r   r!   r   r   r   rQ   Zremove_group_itemro   keyra   rC   r(   r(   r)   _registry_indexer!  sH   








zAstScanning._registry_indexerru   c                 C   sr   g }|D ]2}t |jdkrqt|td}t|d}t|ddtkr"q| |}| ||}d|ur6|| q|S )zparse the AST nodes of decorators object to registry indexer

        Args:
            nodes (list): list of AST decorator nodes

        Returns:
            list: list of registry indexer
        rc   Nr   rC   )rI   rJ   r?   ri   r   r   r   rh   )r4   ru   resultsr7   r!   r   Zparse_outputr   r(   r(   r)   parse_decoratorsU  s   	


zAstScanning.parse_decoratorsc                 C   s   |    t|ddd}| }W d    n1 sw   Y  d|}t|}| j|dd}| |t |t< | |t	 |t	< |t 
|t	  |S )Nrutf8)encodingrW   FrO   )rS   open	readlinesre   r9   parserU   r   rm   rn   rj   )r4   filecodedatar7   rQ   r(   r(   r)   generate_astn  s   


zAstScanning.generate_astr,   N)T)TrW   )rJ   
__module____qualname__r5   objectboolr=   r9   r:   rE   r   rK   rA   r>   rF   rP   rS   rV   rU   r   r   r   r@   r   r   r(   r(   r(   r)   r+   D   s2    

j,4r+   c                   @   s   e Zd ZdddZ	d dededefddZd	d
 ZdedefddZ	d!ddZ
d"ddZdd Zdd Zdd Zdd ZdeefddZeedfddZdS )#FilesAstScanningr,   Nc                 C   s   t  | _g | _g | _d S r.   )r+   	astScaner	file_dirsrequirement_dirsr3   r(   r(   r)   r5   }  s   
zFilesAstScanning.__init__import_packagecurrent_pathc           	      C   s   | td rtd d|ddd  d S | td rV|d}|d}d}t|D ]\}}|dkr<|} nq0|d|  }|||d  dd| d S |S )z
        Args:
            import_package (str): relative import or abs import
            current_path (str): path/to/current/file
        r   /r   r   N.pyrW   )
startswithIGNORED_PACKAGESMODELSCOPE_PATHre   r   	enumeraterj   )	r4   r   r   Zcurrent_path_listZimport_package_listr]   r   ro   Zabs_path_listr(   r(   r)   _parse_import_path  s&   


z#FilesAstScanning._parse_import_pathc                 C   s   d S r.   r(   )r4   Zimport_abs_pathr(   r(   r)   _traversal_import  s   z"FilesAstScanning._traversal_importscan_resultc                 C   s   g }| t|t   | t|t   t|D ]\}}d|dd kr.d||< q|dd ||< qt }|D ]}tD ]}|	|rM|
| qAq=tt|t| S )a  parse import and from import dicts to a third party package list

        Args:
            scan_result (dict): including the import and from import result

        Returns:
            list: a list of package ignored 'modelscope' and relative path import
        rW   r   r   )rj   r@   rk   keysrl   r   r   setr   r   add)r4   r   rQ   r   ro   ZignoredZignored_packager(   r(   r)   parse_import  s   	


zFilesAstScanning.parse_importFc                 C   sb   g | _ |d u st|dkr| j||d d S |D ]}tj||}tj|r.| j||d qd S )Nr   include_init)r   rg   _traversal_filesospathre   isdir)r4   r   Zcheck_sub_dirr   ro   Zsub_dirr(   r(   r)   traversal_files  s   z FilesAstScanning.traversal_filesc                 C   s   t |}|D ]Q}|jdkr|sq|jdr|jdks(|jds(|jdr)q| r6| j|j|d q| rH|jdrH| j	
|j q| rXd|jv rX| j
|j qd S )Nz__init__.py__z.jsonz.mdr   r   requirement)r   scandirra   r   endswithis_dirr   r   is_filer   rh   r   )r4   r   r   Zdir_listro   r(   r(   r)   r     s&   

z!FilesAstScanning._traversal_filesc                 C   s   z| j |}W n8 ty@ } z,t|j}td| d|d j d|d j d|d j dt	|j
 d| d| d	d }~ww | |}|t |fS )
NzDuring ast indexing the file z', a related error excepted in the file z
 at line: z: "z" with error msg: "z: z'", please double check the origin file z- to see whether the file is correctly edited.)r   r   	Exception	traceback
extract_tb__traceback__filenamelinenolinerI   rJ   r   rm   )r4   r   rQ   edetailimport_listr(   r(   r)   _get_single_file_scan_result  s.   
	z-FilesAstScanning._get_single_file_scan_resultc              	   C   sJ   t  }|D ]}|| t D ]}t|t|| t t|| t i||< qq|S r.   )r/   rm   FILE_NAME_KEYrk   
MODULE_KEY)r4   forward_indexinverted_indexr   ro   r(   r(   r)   _inverted_index  s   
z FilesAstScanning._inverted_indexc                 C   s,   t  }| D ]\}}|t ||t < q|S r.   )r/   itemsrk   r   )r4   r   module_importr   Z
value_dictr(   r(   r)   _module_import  s   zFilesAstScanning._module_importc                 C   s    d|v r|d= d|v r|d= |S )N)Z
OPTIMIZERSdefaultra   )ZLR_SCHEDULERr   ra   r(   )r4   r   r(   r(   r)   _ignore_useless_keys  s
   z%FilesAstScanning._ignore_useless_keysc                 C   s   t   }|dur|| _n| || td| d|  t }| jD ]'}||dd }|tj	ddd}| 
|\}	}
t|	t|
t|i||< q#| |}| |}| |}t|t|i}tdt| d	t   |  d
 |S )a  the entry method of the ast scan method

        Args:
            target_file_list can override the dir and folders combine
            target_dir (str, optional): the absolute path of the target directory to be scanned. Defaults to None.
            target_folder (list, optional): the list of
            sub-folders to be scanned in the target folder.
            Defaults to SCAN_SUB_FOLDERS.

        Returns:
            dict: indexer of registry
        NzAST-Scanning the path "z!" with the following sub folders r   r   r   rW   zScanning done! A number of z. components indexed or updated! Time consumed rx   )timer   r   loggerinfor/   rfindreplaceospsepr   rm   rk   r   r   r   r   	INDEX_KEYREQUIREMENT_KEYrg   )r4   Ztarget_file_list
target_dirZtarget_foldersstartry   r   r   r"   rb   r   Zinverted_index_with_resultsr   r   r(   r(   r)   get_files_scan_results  s@   




z'FilesAstScanning.get_files_scan_resultsc           
      C   s   g | _ |rt|tr|| _ n| || g }t }| j D ]}tj|}|| |||< qt	dd |d}t
| }	|	 |fS )Nc                 S   s   t | t | S r.   rF   )xyr(   r(   r)   <lambda>?  s    z2FilesAstScanning.files_mtime_md5.<locals>.<lambda>rW   )r   r8   r@   r   r/   r   r   getmtimerh   r   hashlibr   encode	hexdigest)
r4   target_pathZtarget_subfolder	file_listr   Zfiles_mtime_dictro   mtimeZ
result_strr   r(   r(   r)   files_mtime_md50  s   


z FilesAstScanning.files_mtime_md5r   r.   NFF)rJ   r   r   r5   rF   r   r   r/   r@   r   r   r   r   r   r   r   r   SCAN_SUB_FOLDERSr   r   r(   r(   r(   r)   r   {  s4    





3r   objr,   c                 C   sd   t j|}|rt j|st j|dd t|d}||  W d   dS 1 s+w   Y  dS )a  Write data to a given ``filepath`` with 'wb' mode.

    Note:
        ``write`` will create a directory if the directory of ``filepath``
        does not exist.

    Args:
        obj (bytes): Data to be written.
        filepath (str or Path): Path to write data.
    T)exist_okwbN)r   r   dirnameexistsmakedirsr   write)r   r   r   fr(   r(   r)   ensure_writeG  s   "r   Fc                 C   s   dd | t   D | t < ddlm} || t< tj|d\| t< | t< t	
 | t< t| }|r8|t	
 t}t| | dd | t   D | t < d S )Nc                 S   s   i | ]	\}}t ||qS r(   r   .0kvr(   r(   r)   
<dictcomp>\  s    z_save_index.<locals>.<dictcomp>r   __version__r   c                 S      i | ]
\}}t ||qS r(   r9   literal_evalr   r(   r(   r)   r   g      
)r   r   modelscope.versionr  VERSION_KEYfile_scannerr   MD5_KEYFILES_MTIME_KEYr   as_posixMODELSCOPE_PATH_KEYjsondumpsr   r#   r   r   )r   	file_pathr   with_templater  Z
json_indexr(   r(   r)   _save_indexZ  s    


r  c                 C   sr   t | d}| }W d    n1 sw   Y  |r%| tt }t|}dd |t	 
 D |t	< |S )Nrbc                 S   r  r(   r  r   r(   r(   r)   r   u  r  z_load_index.<locals>.<dictcomp>)r   readdecoder   r#   r   r  r  loadsr   r   )r  r  r   Zbytes_indexwrapped_indexr(   r(   r)   _load_indexm  s   




r  c                 C   s0  | t  }tt|t| }tt|t| }g }|D ]}||vr/|| || kr/|| q|| || t|dkrg }g }| t D ]}	| t |	 t |v rd||	 || t |	 t  qH|D ]}	| t |	= qg|D ]}	|	| t	 v r~| t	 |	= qqt
|}
| t |
t  | t	 |
t	  d S )Nr   )r  r@   r   rh   rj   rg   r   r   r   r   r
  r   update)r   r   Zorigin_files_mtimeZ	new_filesZremoved_filesZupdated_filesr   Zremove_index_keysZremove_requirement_keysr   Zupdated_indexr(   r(   r)   _update_index|  s<   





r  c                  C   sF   t tttjd } d}t tt  }| || kr!dS dS )Nz%Y-%m-%d %H:%M:%Si3TF)introundr   strptimer   Z__release_datetime__	timestampnow)Zrelease_timestampZSECONDS_PER_YEARZcurrent_timestampr(   r(   r)   __is_develop_model  s   r!  c              
   C   s:  t d|}t d|}t j||}d}|r#td t| }|S t rtd|  t j	|rkt
|}tj| d\}	}
|}ddlm} |t |krT|t |	ksZ|t |krjtd	 t||
 t|||  ntd
| d t| }t|||  td|t  d|t  dt|t  d |S t }|S )a  get the index from scan results or cache

    Args:
        file_list: load indexer only from the file lists if provided, default as None
        force_rebuild: If set true, rebuild and load index, default as False,
        indexer_file_dir: The dir where the indexer file saved, default as INDEXER_FILE_DIR
        indexer_file: The indexer file name, default as INDEXER_FILE
    Returns:
        dict: the index information for all registered modules, including key:
        index, requirements, files last modified time, modelscope home path,
        version and md5, the detail is shown below example: {
            'index': {
                ('MODELS', 'nlp', 'bert'):{
                    'filepath' : 'path/to/the/registered/model', 'imports':
                    ['os', 'torch', 'typing'] 'module':
                    'modelscope.models.nlp.bert'
                },
                ...
            }, 'requirements': {
                'modelscope.models.nlp.bert': ['os', 'torch', 'typing'],
                'modelscope.models.nlp.structbert': ['os', 'torch', 'typing'],
                ...
            }, 'files_mtime' : {
                '/User/Path/To/Your/Modelscope/modelscope/preprocessors/nlp/text_generation_preprocessor.py':
                16554565445, ...
            },'version': '0.2.3', 'md5': '8616924970fe6bc119d1562832625612',
            'modelscope_path': '/User/Path/To/Your/Modelscope'
        }
    ZMODELSCOPE_CACHEZMODELSCOPE_INDEX_FILENz4Force rebuilding ast index from scanning every file!zLoading ast index from r  r   r  z}Updating the files for the changes of local files, first time updating will take longer time! Please wait till updating done!zNo valid ast index found from z$, generating ast index from scratch!z,Loading done! Current index file version is z, with md5 z and a total number of z components indexed)r   getenvr   re   r   r   r
  r   r!  r   r  r   r  r  r	  r  r  r  rg   r   load_from_prebuilt)r   force_rebuildZindexer_file_dirZindexer_file	cache_dirZ
index_filer  r   r  r   r   r  r(   r(   r)   
load_index  sV   $





r&  c                 C   sJ   | d u rt  jd }tj|t} tj| r t| dd}|S t	 }|S )Nr   Tr  )
presolveparentsr   r   re   TEMPLATE_FILEr   r  generate_ast_template)r  
local_pathr   r(   r(   r)   r#    s   r#  c                 C   sT   t |d}| d u rt jd }tj|t} t|| dd tj	| s(t
d|S )Nr$  r   Tr'  z;The index file is not create correctly, please double check)r&  r(  r)  r*  r   r   re   r+  r  r   r   )r  r$  r   r-  r(   r(   r)   r,    s   
r,  __main__r.  r   r   r.   )NT)Vr9   r   r$   r   Zos.pathr   r   r   r   r   	functoolsr   pathlibr   typingr   r  r   r   Zmodelscope.metainfor   r   r	   r
   r   r   r   r   r   r   r   Zmodelscope.utils.constantr   r   Zmodelscope.utils.file_utilsr   Zmodelscope.utils.registryr   __file__r(  rH   r)  r*  r   ZINDEXER_FILE_DIRr   r   r   ZINDEXER_FILErm   rn   rl   rk   r   r  r	  r  r   r  r   r   ri   r   ZMODULE_NAMEr   r#   r+  r*   r   r   r+   r   r
  bytesrF   r   r  r  r  r!  r&  r#  r,  rJ   r   printr(   r(   r(   r)   <module>   s   4  9 J

"

Q


