o
    [+ iù5  ã                   @   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   úc/home/app/PaddleOCR-VL-test/.venv_paddleocr/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 )zþValidate 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.

    z€File %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   )Ú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pbarÚ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ƒr‹t	| 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
üÿþýüû