o
    ̳i,                     @   s  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 d dl	m	Z	 d dl
mZ d dlZd dlmZmZ d dlmZ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 eeZdZ dZ!dZ"dZ#G dd dZ$de%de	e%B fddZ&G dd de'Z(de%dee% dee)e%e*e% e*e% f  fddZ+d2de%de,de,de,fd d!Z-d"e%d#ede%fd$d%Z.d&d'd(e%dee% d#ed)e/de$f
d*d+Z0d"e%d)e/d#ede%dB fd,d-Z1d.e*e% d/e*e% e%B dB de*e% fd0d1Z2dS )3    N)IterableSequence)datetime)TemporaryDirectory)ApiBlobTypeApiStartBlobUploadRequest)ApiDatasetNewFileApiUploadDirectoryInfo)Timeout)tqdm)CallbackIOWrapper)build_kaggle_client)BackendErrorhandle_call2   zarchive.zip   iX  c                   @   sF   e Zd Z		d
dedee dB ded  dB fddZdefdd	ZdS )UploadDirectoryInfoNnamefilesdirectoriesc                 C   s4   || _ |d ur	|ng | _|d ur|| _d S g | _d S N)r   r   r   )selfr   r   r    r   H/home/ubuntu/.local/lib/python3.10/site-packages/kagglehub/gcs_upload.py__init__   s   zUploadDirectoryInfo.__init__returnc                 C   sN   t  }| j|_g |_| jD ]}t }||_|j| qdd | jD |_|S )Nc                 S   s   g | ]}|  qS r   )to_proto).0dr   r   r   
<listcomp>0       z0UploadDirectoryInfo.to_proto.<locals>.<listcomp>)r	   r   r   r   tokenappendr   )r   r   filefr   r   r   r   (   s   
zUploadDirectoryInfo.to_proto)NN)__name__
__module____qualname__strlistr   r	   r   r   r   r   r   r      s    



r   stringr   c                 C   sB   g d}|D ]}zt | d d |jddW   S    Y q| S )N)z%Y-%m-%dT%H:%M:%Sz%Y-%m-%dT%H:%M:%SZz%Y-%m-%dT%H:%M:%S.%fz%Y-%m-%dT%H:%M:%S.%fZ   r   )microsecond)r   strptimereplace)r*   time_formatstr   r   r   parse_datetime_string5   s   "r1   c                   @   s:   e Zd ZdeddfddZeddededefd	d
Z	dS )File	init_dictr   Nc                 C   s"   dd |  D }| j| d S )Nc                 S   s   i | ]	\}}|t |qS r   )r1   )r   kvr   r   r   
<dictcomp>A   s    z!File.__init__.<locals>.<dictcomp>)items__dict__update)r   r3   parsed_dictr   r   r   r   @   s   zFile.__init__r   size	precisionc                 C   sV   g d}d}| dkr|dk r|d7 }| d } | dkr|dk s| d| d||  S )	N)BKBMBGBTBr   i         g      @.r$   r   )r;   r<   suffixessuffix_indexr   r   r   get_sizeD   s   zFile.get_size)r   )
r%   r&   r'   dictr   staticmethodfloatintr(   rG   r   r   r   r   r2   ?   s    r2   base_dirignore_patternsc                 #   sr    t | D ]0\}}}t|}g }|D ]}|| |  t fdd|D s-|| q|r6|||fV  qdS )a  An `os.walk` like directory tree generator with filtering.

    This method filters out files matching any ignore pattern.

    Args:
        base_dir (str): The base dir to walk in.
        ignore_patterns (Sequence[str]):
            The patterns for ignored files. These are standard wildcards relative to base_dir.

    Yields:
        Iterable[tuple[str, list[str], list[str]]]: (base_dir_path, list[dir_names], list[filtered_file_names])
    c                 3   s"    | ]}t j t |d V  qdS ))r   patN)fnmatchr(   )r   rN   
rel_file_pr   r   	<genexpr>`   s     z filtered_walk.<locals>.<genexpr>N)oswalkpathlibPathrelative_toanyr"   )rL   rM   dir_path	dir_names
file_namesdir_pfiltered_files	file_namer   rP   r   filtered_walkN   s   

r_   rC   session_uri	file_sizebackoff_factorc              	   C   s   dd| d}d}|t k raz)tj| |td}|jdkr5|jd}|r2t|dd	 d	 }|W S W dS |W S  tj	t
fy\   td
| d t| t|d d}|d	7 }Y nw |t k sdS )z)Check the status of the resumable upload.0zbytes */)Content-LengthContent-Ranger   )headerstimeout4  Range-rC   z8Network issue while checking uploaded size, retrying in  seconds...   <   )MAX_RETRIESrequestsputREQUEST_TIMEOUTstatus_coderf   getrK   splitConnectionErrorr
   loggerinfotimesleepmin)r`   ra   rb   rf   retry_countresponserange_headerbytes_uploadedr   r   r   _check_uploaded_sizef   s(   

r   	file_path	item_typec                    sz  t j| }t * t |_t j| _|_t	t j
| _t fdd}W d   n1 s6w   Y  |j}ddi}d}d}d}t| d}	t|d	d
dd}
|tk r|dkse||k rza|dkrqd|d< d}n|	| d| d|d  d| |d< t|
j|	d}tj|||td}|jdv r|jW W  d   W  d   S |jdkrt||}nd|j d|j }t|W n; tjtjfy } z*td| d| d t !| t"|d d}|d7 }t||}||
_#W Y d}~nd}~ww |tk r|dkse||k seW d   n1 sw   Y  W d   |jS W d   |jS 1 s5w   Y  |jS )a  Uploads a file to a remote server as a blob and returns an upload token.

    Args:
        file_path: The path to the file to be uploaded.
        item_type : The type of the item associated with the file.

    Returns:
        A str token of uploaded blob.
    c                      s    j jS r   )blobsblob_api_clientstart_blob_uploadr   
api_clientrr   r   <lambda>   s    z_upload_blob.<locals>.<lambda>NzContent-Typezapplication/octet-streamr   rC   rb	Uploadingr=   T)totaldescunit
unit_scalerc   rd   zbytes rj   /re   read)rf   datarg   )      rh   zUpload failed with status code z: zNetwork issue: z, retrying in rk   rl   rm   )$rS   pathgetsizer   r   typebasenamer   content_lengthrK   getmtimelast_modified_epoch_secondsr   
create_urlopenr   rn   seekr   r9   ro   rp   rq   rr   r!   r   textr   ru   r
   rv   rw   rx   ry   rz   n)r   r   ra   r|   r`   rf   r{   uploaded_bytesrb   r$   pbarupload_dataupload_responseupload_failed_exceptioner   r   r   _upload_blob   sd   





*   r   F)quietfolderr   c                C   s  d}t | |dD ]\}}}|t|7 }q|tkr|s#tdt d t [}tj|t	}t
|d+}	t | |dD ]\}
}}|D ]}tj|
|}|	|tj||  qBq;W d    n1 sbw   Y  dd t|||dfD }td	|d
W  d    S 1 sw   Y  tdd}tj| rt| ||d}|r|j| |S t | |dD ]P\}
}}tj|
| }|}|dkr|tjD ]}|jD ]}|j|kr|} nqt|d}|j| |}q|D ]}ttj|
|||d}|r|j| qq|S )Nr   )rL   rM   z
More than z* files detected, creating a zip archive...wc                 S   s   g | ]}|d ur|qS r   r   )r   r!   r   r   r   r      s
    z0upload_files_and_directories.<locals>.<listcomp>)r   r   r   archive)r   r   root)r   rD   )r_   lenMAX_FILES_TO_UPLOADrv   rw   r   rS   r   joinTEMP_ARCHIVE_FILEzipfileZipFilewriterelpath_upload_filer   isfiler   r"   rt   sepr   r   )r   rM   r   r   
file_count_r   temp_dirzip_pathzipfr   r#   r   tokens	root_dictr!   r   current_dictpartsubdirnew_dirr   r   r   upload_files_and_directories   s`   
 



r   c                C   sl   |s	t d|   tj| st d|  dS tj| }t| |}|s4t d|  d t	| d  |S )a  Helper function to upload a single file.

    Args:
        full_path: path to the file to upload
        quiet: suppress verbose output
        item_type: Type of the item that is being uploaded.

    Returns:
        A str token of uploaded file if successful, otherwise None.
    zStarting upload for file z+Skip uploading %s because it is not a file.NzUpload successful: z ())
rv   rw   rS   r   r   warnr   r   r2   rG   )r   r   r   r   r!   r   r   r   r      s   
 r   default
additionalc                    sF   dt dt fdd |du rg }nt|t r|g} fdd| | D S )zYMerges additional patterns with the default, and normalize the dir pattern with wildcard.patternr   c                 S   s   |  dr	| d S | S )Nr   *)endswith)r   r   r   r   add_wildcard_to_dir  s   z/normalize_patterns.<locals>.add_wildcard_to_dirNc                    s   g | ]} |qS r   r   )r   r   r   r   r   r   #  r    z&normalize_patterns.<locals>.<listcomp>)r(   
isinstance)r   r   r   r   r   normalize_patterns  s   
r   )rC   )3rO   loggingrS   rU   rx   r   collections.abcr   r   r   tempfiler   ro   &kagglesdk.blobs.types.blob_api_servicer   r   ,kagglesdk.datasets.types.dataset_api_servicer   r	   requests.exceptionsr
   r   
tqdm.utilsr   kagglehub.clientsr   kagglehub.exceptionsr   r   	getLoggerr%   rv   r   r   rn   rq   r   r(   r1   objectr2   tupler)   r_   rK   r   r   boolr   r   r   r   r   r   r   <module>   sT    

0B
B.