
    9i"                     4   S SK r S SKrS SKrS SKrS SKJr  S SKJrJrJ	r	  S SK
JrJrJr  S rS rS\4S jrS\4S	 jrS\4S
 jrS\S\4S jrS\S\4S jrS rSS\SS4S jrS\\\\\4   S\4S jr   SS\\\\\4   S\\   S\\   S\\   S\4
S jjrg)    N)Path)Errorcopy2copystat)BinaryIOOptionalUnionc                 $   [         R                  " U 5      nUR                  nUR                  nUc  Ub  gUR                  (       d  / OUR                  nU(       a  US   S;   a  UR                  S5      OU  [        U5      S:X  a
  US   S;   a  gg)zto decide if a func could receive dict inputs or not

Args:
    func (class): the target function to be inspected

Returns:
    bool: if func only has one arg ``input`` or ``inputs``, return True, else return False
Fr   )selfcls   )inputinputsT)inspectgetfullargspecvarargsvarkwargspoplen)funcfull_args_specr   r   r   s        [/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/modelscope/utils/file_utils.pyfunc_receive_dict_inputsr      s     ++D1N$$G  EO#((2n.A.ADT!W7DHHQKd
4yA~$q'%88    c                      [         R                  R                  [        R                  " 5       R                  SSS5      5      n U $ )z)
default base dir: '~/.cache/modelscope'
z.cache
modelscopehub)ospath
expanduserr   homejoinpath)default_cache_dirs    r    get_default_modelscope_cache_dirr%   $   s9     **499;+?+?,,' (r   returnc                  z    [         R                  R                  [         R                  " S[	        5       5      5      $ )z}Get modelscope cache dir, default location or
   setting with MODELSCOPE_CACHE

Returns:
    str: the modelscope cache root.
MODELSCOPE_CACHE)r   r    r!   getenvr%    r   r   get_modelscope_cache_dirr+   -   s0     77
		$&F&HIK Kr   c                  R    [         R                  R                  [        5       S5      $ )zOGet model cache root path.

Returns:
    str: the modelscope model cache root.
modelsr   r    joinr+   r*   r   r   get_model_cache_rootr0   8   s     77<<02H==r   c                  R    [         R                  R                  [        5       S5      $ )zGet dataset raw file cache root path.
if `MODELSCOPE_CACHE` is set, return `MODELSCOPE_CACHE/datasets`,
else return `~/.cache/modelscope/hub/datasets`

Returns:
    str: the modelscope dataset raw file cache root.
datasetsr.   r*   r   r   get_dataset_cache_rootr3   A   s     77<<02J??r   
dataset_idc                 d    [        5       nU c  U$ [        R                  R                  XS-   5      $ )zGet the dataset_id's path.
   dataset_cache_root/dataset_id.

Args:
    dataset_id (str): The dataset id.

Returns:
    str: The dataset_id's cache root path.
/)r3   r   r    r/   )r4   dataset_roots     r   get_dataset_cache_dirr8   L   s5     *+L%-< (277<<3&4( (r   model_idc                 d    [        5       nU c  U$ [        R                  R                  XS-   5      $ )zcache dir precedence:
    function parameter > environment > ~/.cache/modelscope/hub/model_id

Args:
    model_id (str, optional): The model id.

Returns:
    str: the model_id dir if model_id not None, otherwise cache root dir.
r6   )r0   r   r    r/   )r9   	root_paths     r   get_model_cache_dirr<   [   s4     %&I (9 #bggllc>/# #r   c                 t    [        U S5       nUR                  5       nS S S 5        U$ ! , (       d  f       W$ = f)Nr)openread)r    ftexts      r   	read_filerC   j   s/    	dCAvvx 
K 
Ks   (
7Fc           
         [         R                  " U 5      nUb	  U" X5      nO
[        5       n[         R                  " XS9  / n	U GH\  n
X;   a  M  [         R                  R                  X
5      n[         R                  R                  X5      n [         R                  R                  U5      (       a  [         R                  " U5      nU(       a'  [         R                  " X5        [        XU(       + S9  M  [         R                  R                  U5      (       d	  U(       a  M  [         R                  R                  U5      (       a  [        UUUUUUS9  GM  U" X5        GM  [         R                  R                  U5      (       a  [        UUUUUUS9  GMT  U" X5        GM_      [        X5        U	(       a  [        U	5      eU$ ! [         a*  nU	R                  UR                  S   5         SnAGM  SnAf[          a(  nU	R#                  X[%        U5      45         SnAGM  SnAff = f! [          a4  n['        USS5      c  U	R#                  X[%        U5      45         SnANSnAff = f)z7copy from py37 shutil. add the parameter dirs_exist_ok.N)exist_ok)follow_symlinks)dirs_exist_okr   winerror)r   listdirsetmakedirsr    r/   islinkreadlinksymlinkr   existsisdircopytree_py37r   extendr   OSErrorappendstrgetattr)srcdstsymlinksignorecopy_functionignore_dangling_symlinksrG   namesignored_nameserrorsnamesrcnamedstnamelinktoerrwhys                   r   rQ   rQ   q   s    JJsOEs*KK,F '',,s)'',,s)(	8ww~~g&&W- JJv/W8|L 77>>&116N ww}}W--%##$")*79 &g7w''!"/1 g/O \0
 FmJ  	'MM#((1+&& 	8MM7SX677	8  03
D)1MM3SX./0s[   A&G7+G$2GG$2GG'H- 
H*G55H*H%%H*-
I+7*I&&I+file_path_or_objc                    [        U [        [        45      (       a%  [        U 5      nUR                  5       R                  $ [        U [
        5      (       a  [        U 5      $ [        U [        R                  5      (       aS  U R                  5       nU R                  S[        R                  5        U R                  5       nU R                  U5        U$ [        S5      e)Nr   zCUnsupported type: must be string, Path, bytes, or io.BufferedIOBase)
isinstancerU   r   statst_sizebytesr   ioBufferedIOBasetellseekr   SEEK_END	TypeError)rf   	file_pathcurrent_positionsizes       r   get_file_sizeru      s    "S$K00)*	~~'''	$e	,	,#$$	$b&7&7	8	8+002a-$$&./Q
 	
r   buffer_size_mb	tqdm_descdisable_tqdmc           
      @   SSK Jn  [        U 5      nUS:  aS  SnSn[        U [        [
        45      (       a.  [        U [
        5      (       a  U O
[        U 5      nUR                  nSU S3nUS-  S-  n[        R                  " 5       n	/ n
U" USS	S	S
UUS9n[        U [        [
        45      (       a  [        U S5       nUR                  U5      =n(       ax  U
R                  [        R                  " U5      R                  5       5        U	R                  U5        UR                  [        U5      5        UR                  U5      =n(       a  Mx  S S S 5        U	R                  5       n	UnGO[        U [        5      (       aP  U	R                  U 5        U	R                  5       n	U
R                  U	5        [        U 5      nUR                  U5        GO[        U [         R"                  5      (       a  U R%                  S[&        R(                  5        U R                  U5      =n(       ax  U
R                  [        R                  " U5      R                  5       5        U	R                  U5        UR                  [        U5      5        U R                  U5      =n(       a  Mx  U	R                  5       n	UnU R%                  S[&        R(                  5        OUR+                  5         [-        S5      eUR+                  5         U U	UU[        U
5      U
S.$ ! , (       d  f       GN= f)Nr   )tqdmi   @Fz
Large Filez[Validating Hash for ]i   TB)totalinitial
unit_scaledynamic_ncolsunitdescdisablerbz5Input must be str, Path, bytes or a io.BufferedIOBase)rf   	file_hash	file_size
chunk_size
chunk_numschunk_hash_list)	tqdm.autorz   ru   rh   rU   r   r`   hashlibsha256r?   r@   rT   	hexdigestupdater   rk   rl   rm   ro   r   SEEK_SETclose
ValueError)rf   rv   rw   rx   rz   r   r`   r    buffer_sizer   r   progressrA   
byte_chunkfinal_chunk_sizes                  r   get_file_hashr      s    ./I%%&d44'1 $(( ((#-12B-C 99D+D63	 4'$.K IOH "S$K00"D)Q !{ 33*3&&w~~j'A'K'K'MN  ,J0 !"{ 33*3 *
 '')	&	$e	,	,)*'')	y)/0()	$b&7&7	8	8a-,11+>>j>""7>>*#=#G#G#IJZ(OOC
O, -11+>>j> '')	&a- 	CE 	E NN -&/** A *)s   =BL
L)r   z[Calculating]T)r   r   rl   r   pathlibr   shutilr   r   r   typingr   r   r	   r   r%   rU   r+   r0   r3   r8   r<   rC   rQ   rk   intru   booldictr   r*   r   r   <module>r      s     	 	  ) ) , ,0K# K>c >@ @(c (c (## ## # ! %+0 %FR
E#tUH*D$E 
# 
( %&.#'	HCuh67HSMH }H 4.	H
 
Hr   