
    gB                    D   d dl m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
mZ d dlmZ d dlmZmZmZmZm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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gZ* G d d      Z+ ed       G d de             Z,e G d de+             Z-y)    )annotationsN)	dataclassfield)BufferedReaderFileIO)Path)AnyLiteralOptionalUnioncast)HTTPStatusErrorResponse   )DEFAULT_FILE_OPTIONSDEFAULT_SEARCH_OPTIONS)StorageApiError)

BaseBucketCreateSignedURLsOptionsDownloadOptionsFileOptionsListBucketFilesOptionsRequestMethodSignedUploadURL
UploadDataUploadResponse
URLOptions)AsyncClientStorageExceptionAsyncBucketc                  l   e Zd ZU dZded<   ded<   	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZ	 d	 	 	 	 	 	 	 	 	 dd	Zi f	 	 	 	 	 	 	 dd
Zi f	 	 	 	 	 	 	 ddZ	i fddZ
d dZd dZd!dZ	 	 	 	 d"dZ	 	 	 	 d#dZ	 	 d$	 	 	 	 	 d%dZi fd&dZ	 d	 	 	 	 	 	 	 	 	 d'dZ	 d	 	 	 	 	 	 	 d(dZ	 d	 	 	 	 	 	 	 d(dZd)dZy)*AsyncBucketActionsMixinz(Functions needed to access the file API.stridr   _clientNc                v  K   	  | j                   j                  ||f|xs i ||d| d {   }|j                          |r0d|v r,t        |d   d   t              r|d   d   j                          |S 7 H# t        $ r5}|j                  j                         }	t        |	d   |	d   |	d         d }~ww xY ww)N)headersjsonfilesmessageerror
statusCodefile   )
r%   requestraise_for_statusr   responser(   r   
isinstancer   close)
selfmethodurlr'   r(   r)   kwargsr1   excresps
             M/var/www/openai/venv/lib/python3.12/site-packages/storage3/_async/file_api.py_requestz AsyncBucketActionsMixin._request&   s     	V1T\\11%,]UNT H %%' Vu_E&M!4Dn)U&M!""$  	V<<$$&D!$y/4=$|BTUU	Vs8   B9)A8 A6A8 4B96A8 8	B60B11B66B9c                  K   | j                  |      }| j                  dd|        d{   }|j                         }t        j                  j                  t        | j                  j                        |d   z         }t        j                  j                  |j                        }|j                  d      st        d      |j                         |d   d   |dS 7 w)	z
        Creates a signed upload URL.

        Parameters
        ----------
        path
            The file path, including the file name. For example `folder/image.png`.
        POST/object/upload/sign/Nr6   tokenzNo token sent by the APIr   )
signed_urlr?   path)_get_final_pathr;   r(   urllibparseurlparser#   r%   base_urlparse_qsquerygetr   geturl)r4   rA   _pathr1   datafull_urlquery_paramss          r:   create_signed_upload_urlz0AsyncBucketActionsMixin.create_signed_upload_url>   s      $$T*v1EeW/MNN}}-3\\-B-B%%&e4.
 ||,,X^^<("#=>>"//+!'*1-
 	
 Os   *C$C"B6C$c                  K   | j                  |      }t        j                  j                  d|       }t        j                  j	                  d|i      }|j                          d| }|i }|j                  d      }	i }
|	rd|	 |d<   d|	i}
i | j                  j                  t        |}|j                  dd	
      d   }t        |t              s t        |t              st        |t              rd|||j                  d      fi}n d|t!        |d      |j                  d      fi}| j#                  d||||
       d{   }|j%                         }t'        ||j                  d            S 7 0w)a  
        Upload a file with a token generated from :meth:`.create_signed_url`

        Parameters
        ----------
        path
            The file path, including the file name
        token
            The token generated from :meth:`.create_signed_url`
        file
            The file contents or a file-like object to upload
        file_options
            Additional options for the uploaded file
        r>   r?   ?Ncache-controlmax-age=cacheControl/r.   maxsplitr-   content-typerbPUTr)   r'   rL   KeyrA   r]   )rB   rC   rD   rE   	urlencoderJ   rI   r%   r'   r   rsplitr2   r   bytesr   popopenr;   r(   r   )r4   rA   r?   r-   file_optionsrK   _urlrN   	final_urlcache_control_datar'   filename_filer1   rL   s                   r:   upload_to_signed_urlz,AsyncBucketActionsMixin.upload_to_signed_urlV   s    * $$T*||$$';E7%CD||--w.>?{{}oQ|n5	L$((9 .6}o,FL)#]3E
ll""
"
 

 ;;sQ;/3 t^,$&$' hgkk..IJKE t$KK/E 9E7 ' 
 
 $==?4TXXe_==
s   EE:E81E:c                  K   dt        |      i}d}|j                  d      r@ |j                  d|d   i       |j                  d      du rdnd|j                  d       }|j                  d      r |j                  d|d   i       | j                  |      }| j	                  dd| |	       d
{   }|j                         }t        j                  j                  |d         }t        j                  j                  |j                        d|j                   z   }| j                  j                   t        t         |      j                  d       | |d<   |S 7 w)a/  
        Parameters
        ----------
        path
            file path to be downloaded, including the current file name.
        expires_in
            number of seconds until the signed URL expires.
        options
            options to be passed for downloading or transforming the file.
        	expiresIn downloadT
&download=	transformr=   /object/sign/r(   N	signedURLrQ   rU   )r#   rI   updaterB   r;   r(   rC   rD   rE   quoterA   rH   r%   rF   r   lstrip)	r4   rA   
expires_inoptionsr(   download_queryr1   rL   r6   s	            r:   create_signed_urlz)AsyncBucketActionsMixin.create_signed_url   sc     S_-;;z"DKKWZ%89: ;;z*d2 !'++j"9!:; 
 ;;{#DKKgk&:;<##D)D6" ' 
 

 }} ll##D$56ll  *q_< ||$$%d3n&;&;C&@%A.AQR 	[ 
s   B4E&6E$7B.E&c                  K   |t        |      d}d}|j                  d      rL |j                  d|j                  d      i       |j                  d      du rdnd|j                  d       }| j                  dd| j                   |       d	{   }|j                         }|D ]  }t        j                  j                  |d
         }	t        j                  j                  |	j                        d|	j                   z   }	| j                  j                   t        t         |	      j                  d       | |d
<    |S 7 w)a  
        Parameters
        ----------
        path
            file path to be downloaded, including the current file name.
        expires_in
            number of seconds until the signed URL expires.
        options
            options to be passed for downloading the file.
        )pathsrm   rn   ro   Trp   r=   rr   rs   Nrt   rQ   rU   )r#   rI   ru   r;   r$   r(   rC   rD   rE   rv   rA   rH   r%   rF   r   rw   )
r4   r}   rx   ry   r(   rz   r1   rL   itemr6   s
             r:   create_signed_urlsz*AsyncBucketActionsMixin.create_signed_urls   sA     S_=;;z"DKKW[[%<=> ;;z*d2 !'++j"9!:;  DGG9% ' 
 

 }}D ,,''[(9:C,,$$SXX.1SYYK@C <<(()$sC.*?*?*D)EnEUV   
s   BEE	B5Ec                
  K   g }d}|j                  d      r)|j                  d      du rdnd|j                  d       }|r|j                  |       |j                  d      rdnd}|j                  d      r.t        j                  j	                  |j                  d            nd}|r|j                  |       d	j                  |      }d
| }| j                  |      }| j                  j                   | d| | S w)z
        Parameters
        ----------
        path
            file path, including the path and file name. For example `folder/image.png`.
        rn   ro   Trp   rq   zrender/imageobjectN&rQ   z/public/)	rI   appendrC   rD   r_   joinrB   r%   rF   )	r4   rA   ry   _query_stringrz   render_pathtransformation_queryquery_stringrK   s	            r:   get_public_urlz&AsyncBucketActionsMixin.get_public_url   s	     ;;z" ;;z*d2 !'++j"9!:;    0(/K(@nh {{;' LL""7;;{#;< 	    !56xx.<.)$$T*,,''(XeW\NSSs   DDc                   K   | j                  dd| j                  ||d       d{   }|j                         S 7 w)aa  
        Moves an existing file, optionally renaming it at the same time.

        Parameters
        ----------
        from_path
            The original file path, including the current file name. For example `folder/image.png`.
        to_path
            The new file path, including the new file name. For example `folder/image-copy.png`.
        r=   z/object/movebucketId	sourceKeydestinationKeyrs   Nr;   r$   r(   r4   	from_pathto_pathress       r:   movezAsyncBucketActionsMixin.move  K      MM GG&") " 
 
 xxz
   &?=?c                   K   | j                  dd| j                  ||d       d{   }|j                         S 7 w)aZ  
        Copies an existing file to a new path in the same bucket.

        Parameters
        ----------
        from_path
            The original file path, including the current file name. For example `folder/image.png`.
        to_path
            The new file path, including the new file name. For example `folder/image-copy.png`.
        r=   z/object/copyr   rs   Nr   r   s       r:   copyzAsyncBucketActionsMixin.copy$  r   r   c                   K   | j                  dd| j                   d|i       d{   }|j                         S 7 w)z
        Deletes files within the same bucket

        Parameters
        ----------
        paths
            An array or list of files to be deletes, including the path and file name. For example [`folder/image.png`].
        DELETE/object/prefixesrs   Nr   )r4   r}   r1   s      r:   removezAsyncBucketActionsMixin.remove:  sL      twwi e$ ' 
 

 }}
s   'A >A c                   K   | j                  dd| j                   d|        d{   }|j                         S 7 w)z
        Lists info for a particular file.

        Parameters
        ----------
        path
            The path to the file.
        GET/object/info/rU   Nr   r4   rA   r1   s      r:   infozAsyncBucketActionsMixin.infoJ  sE      DGG9AdV,
 
 }}	
r   c                   K   | j                  dd| j                   d|        d{   }|j                  dk(  S 7 w)z
        Returns True if the file exists, False otherwise.

        Parameters
        ----------
        path
            The path to the file.
        HEADr   rU   N   )r;   r$   status_coder   s      r:   existszAsyncBucketActionsMixin.exists\  sJ      DGG9AdV,
 
 ##s**	
s   &><>c                   K   |xs i }ddi}i t         |d|xs di}| j                  dd| j                   ||       d{   }|j                         S 7 w)	z
        Lists all the files within a bucket.

        Parameters
        ----------
        path
            The folder path.
        options
            Search options, including `limit`, `offset`, `sortBy` and `search`.
        zContent-Typezapplication/jsonprefixrn   r=   z/object/list/)r(   r'   N)r   r;   r$   r(   )r4   rA   ry   extra_optionsextra_headersbodyr1   s          r:   listzAsyncBucketActionsMixin.listn  s       2');<
$

 djb

 DGG9%!	 ' 
 
 }}
s   AAAAc                *  K   |j                  d      rdnd}t        j                  j                  |j                  d      xs i       }|rd| nd}| j	                  |      }| j                  d| d| |        d{   }|j                  S 7 w)	z
        Downloads a file.

        Parameters
        ----------
        path
            The file path to be downloaded, including the path and file name. For example `folder/image.png`.
        rq   zrender/image/authenticatedr   rQ   rn   r   rU   N)rI   rC   rD   r_   rB   r;   content)r4   rA   ry   r   r   r   rK   r1   s           r:   ro   z AsyncBucketActionsMixin.download  s      -4KK,D(( 	  &||55gkk+6N6TRTU5I/01r$$T*m1UGL>2
 
 	
s   A>B BBc                  K   |i }|j                  dd      }i }|j                  dd      }|r|j                  d|i       |j                  dd      }|j                  dd      }	i | j                  j                  t        |}
|rNt        j                  |      }t        j                  |j                               |
d<   |j                  d|i       |	r|
j                  i |	       |dk7  r|
d= |j                  d	d
      d   }|rd| |
d<   |j                  d|i       t        |t              s t        |t              st        |t              rd|||
j                  d      fi}n d|t        |d      |
j                  d      fi}| j!                  |      }| j#                  |d| ||
|       d{   }|j                         }t%        ||j'                  d            S 7 0w)  
        Uploads a file to an existing bucket.

        Parameters
        ----------
        path
            The relative file path including the bucket ID. Should be of the format `bucket/folder/subfolder/filename.png`.
            The bucket must already exist before attempting to upload.
        file
            The File object to be stored in the bucket. or a async generator of chunks
        file_options
            HTTP headers.
        NrR   upsertzx-upsertmetadatar'   z
x-metadatar=   rU   r.   rV   rX   rS   rT   r-   rY   rZ   r   r\   r]   r^   )rb   ru   r%   r'   r   r(   dumpsbase64	b64encodeencoder`   r2   r   ra   r   rc   rB   r;   r   rI   )r4   r5   rA   r-   rd   rg   rh   r   r   file_opts_headersr'   metadata_strri   r)   rK   r1   rL   s                    r:   _upload_or_updatez)AsyncBucketActionsMixin._upload_or_update  s    ( L$(($?!!(D1V 45##J5(,,Y=
ll""
"
 
 ::h/L$*$4$4\5H5H5J$KGL!LL*l34NN0/01 V
#;;sQ;/3)1-'AGO$LL.-89 t^,$&$' hgkk..IJKE t$KK/E $$T*hug&eW5 ' 
 
 $==?4TXXe_==
s   F8G-:G+;1G-c                F   K   | j                  d|||       d{   S 7 w)r   r=   Nr   r4   rA   r-   rd   s       r:   uploadzAsyncBucketActionsMixin.upload  s%     & ++FD$MMMM   !!c                F   K   | j                  d|||       d {   S 7 w)Nr[   r   r   s       r:   ru   zAsyncBucketActionsMixin.update
  s%      ++E4|LLLLr   c                $    | j                    d| S )NrU   )r$   )r4   rA   s     r:   rB   z'AsyncBucketActionsMixin._get_final_path  s    ''!D6""    )NNN)r5   r   r6   r#   r'   zOptional[dict[str, Any]]r(   zOptional[dict[Any, Any]]r)   zOptional[Any]r7   r	   returnr   )rA   r#   r   r   )N)
rA   r#   r?   r#   r-   /Union[BufferedReader, bytes, FileIO, str, Path]rd   Optional[FileOptions]r   r   )rA   r#   rx   intry   r   r   dict[str, str])r}   z	list[str]rx   r   ry   r   r   list[dict[str, str]])rA   r#   ry   r   r   r#   )r   r#   r   r#   r   r   )r}   r   r   zlist[dict[str, Any]])rA   r#   r   r   )rA   r#   r   bool)NN)rA   zOptional[str]ry   z Optional[ListBucketFilesOptions]r   r   )rA   r#   ry   r   r   ra   )
r5   zLiteral['POST', 'PUT']rA   r#   r-   r   rd   r   r   r   )rA   r#   r-   r   rd   r   r   r   )rA   r#   r   r#   )__name__
__module____qualname____doc____annotations__r;   rO   rk   r{   r   r   r   r   r   r   r   r   ro   r   r   ru   rB    r   r:   r"   r"       s4   2G -1)-#  *	
 '   
0
: /3@>@> @> >	@>
 ,@> 
@>F AC))%()3=)	)X UW'',/':Q'	'R EG  TD,,  
$++ 
+( #48 2 
	< DF  6 /3Q>&Q> Q> >	Q>
 ,Q> 
Q>n /3	NN >N ,	N
 
N2 /3	MM >M ,	M
 
M#r   r"   Freprc                      e Zd ZdZy)r    zRepresents a storage bucket.N)r   r   r   r   r   r   r:   r    r      s    &r   c                  8    e Zd ZU dZded<    ed      Zded<   y)	AsyncBucketProxyzPA bucket proxy, this contains the minimum required fields to query the File API.r#   r$   Fr   r   r%   N)r   r   r   r   r   r   r%   r   r   r:   r   r     s    ZG e,G[,r   r   ).
__future__r   r   r(   urllib.parserC   dataclassesr   r   ior   r   pathlibr   typingr	   r
   r   r   r   httpxr   r   	constantsr   r   
exceptionsr   typesr   r   r   r   r   r   r   r   r   r   utilsr   r   __all__r"   r    r   r   r   r:   <module>r      s    "    ( %  6 6 + D (   2/s# s#l '* ' ' -. - -r   