o
    0j5                     @   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ddlmZm	Z	m
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mZ dd	lmZmZ dd
lmZmZmZmZ ddlmZ ddl m!Z! G dd de"Z#dd Z$dEddZ%dd Z&dd Z'dd Z(dd Z)dd Z*dd Z+dd  Z,d!d" Z-d#d$ Z.d%d& Z/d'd( Z0ed)dfd*e1d+e2d,e3fd-d.Z4d/d0 Z5d1ee3ee3 f fd2d3Z6dFd5d6Z7d7d8 Z8d9d: Z9d;ee3e!e:ef d<e1fd=d>Z;	?	@	AdGd;ee3e!e:ef dBee1 d,ee3 d+ee2 d<e"f
dCdDZ<dS )Huj   
本文件实现了常用的工具函数

Authors: xiangyiqing(xiangyiqing@baidu.com)
Date:    2023/07/24
    N)datetimetimezone	timedelta)log)FileIntegrityError)DEFAULT_MAX_WORKERSwrapstqdm)ThreadPoolExecutoras_completed)ListUnionBinaryIOOptional)VERSION)Pathc                   @   s    e Zd ZdZdd Zdd ZdS )Dictz
dict classc                 C   s"   |  |d }t|trt|S |S N)get
isinstancedictr   selfkeyvalue r   X/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/aistudio_sdk/utils/util.py__getattr__$   s   zDict.__getattr__c                 C   s   || |< d S r   r   r   r   r   r   __setattr__(   s   zDict.__setattr__N)__name__
__module____qualname____doc__r   r    r   r   r   r   r   "   s    r   c                 C   s   t | tr	t| S | S )z`
    Params
        :resp: dict, response from AIStudio
    Rerurns
        AIStudio object
    )r   r   r   )respr   r   r   convert_to_dict_object,   s   
r&   c                 C   s   | |||dS )u  
    构造错误响应信息。

    Params:
        sdk_code (str): SDK错误码，标识错误类型。
        msg (str): 错误描述信息。
        biz_code (str, optional): 业务层面的错误码，透传自上游接口。
        log_id (str, optional): 与错误相关的日志ID，透传自上游接口。

    Returns:
        dict: 格式化好的错误信息。
    )Z
error_code	error_msgbiz_codelog_idr   )Zsdk_codemsgr(   r)   r   r   r   err_resp9   s
   r+   c                 C   s    t jdd| t jd} t| }|S )u   检测host合法性z
^https?:// )flags)resub
IGNORECASEis_valid_domain)hostresultr   r   r   is_valid_hostN   s   r4   c                 C   s   dS )u   检测域名合法性Tr   )domainr   r   r   r1   Y   s   r1   c                 C   s^   t  }t| d}	 |d}|sn|| qW d   | S 1 s&w   Y  | S )u   将文件计算为sha256值rbT   Nhashlibsha256openreadupdate	hexdigest)	file_pathsha256_hashfiledatar   r   r   calculate_sha256`   s   


rC   c                  C   s(   t tdd} t| }|jdd}|S )uT   
    # 生成 ISO 8601日期时间格式
    # 例如"2023-09-12T11:29:45.703Z"
       )hoursZmilliseconds)Ztimespec)r   r   r   now	isoformat)zonerF   Zformatted_dater   r   r   gen_ISO_format_datestrn   s   
rI   c                 C   s   t  }z&t| d}	 |d}|sn|| qW d   n1 s$w   Y  W n ty<   td|  d Y dS w | }|S )u   将文件计算为md5值r6   Ti   Nz
The file 'z' does not exist.)r9   md5r;   r<   r=   FileNotFoundErrorprintr>   )r?   Zmd5_hashrA   rB   Zmd5_hexr   r   r   gen_MD5{   s$   

rM   c                 C   s   |  d}t|d}|S )u   将字符串计算为base64utf-8)encodebase64	b64encodedecode)Zoriginal_string
bytes_dataZbase64_encodedr   r   r   
gen_base64   s   
rT   c              	   C   s   d|  d| }t jdddd}|| |j}t| W d   n1 s(w   Y  z.t|d}t|	 
d	}W d   n1 sHw   Y  |W tj|r[t| S S tj|rht| w w )
u?   生成指定内容的文件并进行base64编码字符串返回z6version https://git-lfs.github.com/spec/v1
oid sha256:z
size Fwz.txt)deletemodesuffixNr6   rN   )tempfileNamedTemporaryFilewritenamer   debugr;   rP   rQ   r<   rR   ospathexistsremove)r:   sizecontenttmpZtmp_pathfencodedr   r   r   $create_sha256_file_and_encode_base64   s    
rg   c                 C   sF   t | d}| }t|}W d   n1 sw   Y  |dS )u'   读取文件内容并进行Base64编码r6   NrN   )r;   r<   rP   rQ   rR   )filenamerA   contentsZencoded_contentsr   r   r   file_to_base64   s
   
rj   c              	   C   sh   t |dt j}t| D ] \}}}|| d}|D ]}|tj||tj|| qq|	  dS )u   
    压缩指定文件夹
    :param dirpath: 目标文件夹路径
    :param out_full_name: 压缩文件保存路径 xxxx.zip
    :return: 无
    rU   r,   N)
zipfileZipFileZIP_DEFLATEDr^   walkreplacer[   r_   joinclose)dirpathZout_full_nameZzip_objr_   dirnames	filenamesZfpathrh   r   r   r   zip_dir   s   "ru   c                 C   sb   d}t  }t| d}	 ||}|sn|| qW d   | S 1 s(w   Y  | S )z
    hash
    r7   r6   TNr8   )r?   BUFFER_SIZEr@   re   rB   r   r   r   compute_hash   s   


rw   c                 C   s>   t | }||kst|  d| ||f }t| t|dS )zValidate the file hash is expected, if not, delete the file

    Args:
        file_path (str): The file to validate
        expected_sha256 (str): The expected sha256 hash

    Raises:
        FileIntegrityError: If file_path hash is not expected.

    zFile %s integrity check failed, expected sha256 signature is %s, actual is %s, the download may be incomplete, please try again.N)rw   r^   ra   r   errorr   )r?   Zexpected_sha256Zfile_sha256r*   r   r   r   file_integrity_validation   s   

ry   Fmax_workersdisable_tqdm	tqdm_descc                    s    fdd}|S )af  
    A decorator to execute a function in a threaded manner using ThreadPoolExecutor.

    Args:
        max_workers (int): The maximum number of threads to use.
        disable_tqdm (bool): disable progress bar.
        tqdm_desc (str): Desc of tqdm.

    Returns:
        function: A wrapped function that executes with threading and a progress bar.


    c                    s   t   fdd}|S )Nc              	      s   g }t dddt| pdt|  ddE}td' fdd	| D }t|D ]}|d
 ||  q-W d    n1 sFw   Y  W d    |S W d    |S 1 s^w   Y  |S )NT   r   zProcessing z items)
unit_scaleZunit_divisorinitialtotaldescdisable)rz   c                    s(   i | ]}j |g R i |qS r   )Zsubmit).0item)argsexecutorfunckwargsr   r   
<dictcomp>  s    zGthread_executor.<locals>.decorator.<locals>.wrapper.<locals>.<dictcomp>   )r   lenr   r   r=   appendr3   )iterabler   r   resultsZpbarZfuturesfuture)r{   r   rz   r|   )r   r   r   r   wrapper  s4   


z3thread_executor.<locals>.decorator.<locals>.wrapperr   )r   r   r{   rz   r|   )r   r   	decorator   s   z"thread_executor.<locals>.decoratorr   )rz   r{   r|   r   r   r   r   thread_executor   s   r   c                 C   sD   t jdr| dd}n| dd}tj|d |dd}|S )u   
    目录
    win\   /r   .Z___)sysplatform
startswithrsplitr^   r_   rp   ro   )	directoryZmodel_idpartsZmasked_directoryr   r   r   get_model_masked_directory   s
   r   	raw_inputc                 C   s   d}t | tr#t }d| v rdd | dD }|S ||   |S t | trNt }| D ] }t |trMd|v rF|dd |dD  q-||  q-|S )u   
    处理规则
    N,c                 S      g | ]}|  qS r   strip)r   sr   r   r   
<listcomp>5      z$convert_patterns.<locals>.<listcomp>c                 S   r   r   r   )r   ssr   r   r   r   =  r   )r   strlistsplitr   r   extend)r   outputr   r   r   r   convert_patterns-  s"   
	

r   r,   c                 C   sF   |rd| }n
dt jddd }d|ttd}| r!||  |S )u   
    填充header
    ztoken ZAISTUDIO_ACCESS_TOKENr,   )defaultzapplication/json)zContent-TypeAuthorizationzSDK-Version)r^   getenvr   r   r=   )paramstokenauthheadersr   r   r   header_fillC  s   
r   c                 C   sf   t | ddd}| }W d   n1 sw   Y  td|tjtjB }|r/|d S td)u   
    获取yaml
    rrN   )encodingNz^---\s*(.*?)\s*---r   u+   未找到两个 '---' 分隔的 YAML 内容)	r;   r<   r.   searchDOTALL	MULTILINEgroupr   
ValueError)r?   re   rc   matchr   r   r   extract_yaml_blockU  s   
r   c                 C   s   t j| }|dkS )u   
    判断文件名
    z	README.md)r^   r_   basename)r?   	file_namer   r   r   is_readme_mdd  s   r   file_path_or_objreturnc                 C   sr   t | ttfrt| }| jS t | trt| S t | tjr5| 	 }| 
dtj | 	 }| 
| |S td)z
    get size
    r   zCUnsupported type: must be string, Path, bytes, or io.BufferedIOBase)r   r   r   statst_sizebytesr   ioBufferedIOBasetellseekr^   SEEK_END	TypeError)r   r?   current_positionrb   r   r   r   get_file_sizel  s   


r   r   [Calculating]Tbuffer_size_mbc              	   C   s  ddl m} t| }|dkr-d}d}t| ttfr't| tr | nt| }|j}d| d}|d d }t }	g }
||dd	d	d
||d}t| ttfrt	| d,}|
| }ru|
t|  |	| |t| |
| }sXW d   n1 sw   Y  |	 }	|}nVt| tr|	|  |	 }	|
|	 t| }|| n9t| tjr| 
| }r|
t|  |	| |t| | 
| }s|	 }	|}n|  td|  | |	||t|
|
dS )z
    calculate hash
    r   r
   i   @Fz
Large Filez[Validating Hash for ]r}   TB)r   r   r~   Zdynamic_ncolsunitr   r   r6   Nz5Input must be str, Path, bytes or a io.BufferedIOBase)r   	file_hash	file_size
chunk_sizeZ
chunk_numschunk_hash_list)	tqdm.autor   r   r   r   r   r\   r9   r:   r;   r<   r   r>   r=   r   r   r   r   rq   r   )r   r   r|   r{   r   r   r\   r_   buffer_sizer   r   progressre   Z
byte_chunkZfinal_chunk_sizer   r   r   get_file_hash  s|   	





r   )NN)Nr,   )r   r   T)=r$   rY   r   r^   r   r.   rP   r9   r   r   r   rk   Zaistudio_sdkr   Zaistudio_sdk.errorsr   Zaistudio_sdk.configr   	functoolsr	   r   r   concurrent.futuresr   r   typingr   r   r   r   Zaistudio_sdk.constant.versionr   pathlibr   r   r   r&   r+   r4   r1   rC   rI   rM   rT   rg   rj   ru   rw   ry   intboolr   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sz   

	
2
