
    掊g~                         d dl Z d dlZd dlmZmZ d dlmZ  ej                  d      Zed        Z	 G d d      Z
 G d d	e      Zd
 Z G d de      Z G d de      Zd Zy)    N)contextmanagerAsyncExitStack)ClientErrors3fsc               '   ,   K   	 d  y # | $ r Y y w xY wwN )
exceptionss    *lib/python3.12/site-packages/s3fs/utils.pyignoringr   
   s      s   	 c                   2    e Zd Zd ZddZd Zd Zd Zd Zy)	S3BucketRegionCachec                 h    || _         t               | _        d | _        || _        i | _        i | _        y r   )_sessionr   _stack_client_client_kwargs_buckets_regions)selfsessionclient_kwargss      r   __init__zS3BucketRegionCache.__init__   s0    $&+    Nc                   K   || j                   v r| j                   |   S | j                          d {   }||S 	 |j                  |       d {   }|d   d   d   }|| j                  vrnt        j                  d||       | j                  j                   | j                  j                  	 dd|i| j                         d {   | j                  |<   | j                  |   x}| j                   |<   |S 7 7 # t        $ rW}|j                  d   j                  di       j                  d      }|st        j                  d|       |cY d }~S Y d }~d }~ww xY w7 w)	N)BucketResponseMetadataHTTPHeaderszx-amz-bucket-regionzDRC: HEAD_BUCKET call for %r has failed, returning the general clientz:RC: Creating a new regional client for %r on the region %rregion_names3)r   
get_clienthead_bucketr   responsegetloggerdebugr   r   enter_async_contextr   create_clientr   )r   bucket_namegeneral_clientr$   regioneclients          r   get_bucket_clientz%S3BucketRegionCache.get_bucket_client   st    $--'==--#00!!	X+77{7KKH 01-@AVWF&LLL
 +/++*I*I+++&,040C0C+ %DMM&! /3mmF.CC{+E 1
 L 	&

-.]B'*+ 
 Z &% 	&*%s^   1E'C>E'D D D A5E'E%2E' D 	E"AEE"
E'E""E'c                    K   | j                   sL| j                  j                   | j                  j                  di | j
                         d {   | _         | j                   S 7 w)Nr    )r   r   r(   r   r)   r   r   s    r   r"   zS3BucketRegionCache.get_clientF   sV     ||!%!@!@+++HD4G4GH" DL ||s   AA)A'A)c                    K   t         j                  d       | j                  j                          | j                  j                          d | _        | j                  j                          d {    y 7 w)NzRC: discarding all clients)r&   r'   r   clearr   r   r   acloser1   s    r   r3   zS3BucketRegionCache.clearM   sP     12kk  """s   A.A80A61A8c                    K   | S wr   r	   r1   s    r   
__aenter__zS3BucketRegionCache.__aenter__T   s     s   c                 @   K   | j                          d {    y 7 wr   )r3   )r   exc_argss     r   	__aexit__zS3BucketRegionCache.__aexit__W   s     jjls   r   )	__name__
__module____qualname__r   r/   r"   r3   r6   r9   r	   r   r   r   r      s!    &P#r   r   c                   ,     e Zd ZdZdedef fdZ xZS )FileExpireda  
    Is raised, when the file content has been changed from a different process after
    opening the file. Reading the file would lead to invalid or inconsistent output.
    This can also be triggered by outdated file-information inside the directory cache.
    In this case ``S3FileSystem.invalidate_cache`` can be used to force an update of
    the file-information when opening the file.
    filenamee_tagc                 P    t         |   t        j                  d|d|d       y )Nz*The remote file corresponding to filename z
 and Etag z no longer exists.)superr   errnoEBUSY)r   r?   r@   	__class__s      r   r   zFileExpired.__init__d   s!    KK 	
r   )r:   r;   r<   __doc__strr   __classcell__)rE   s   @r   r>   r>   [   s     
 
S 
 
r   r>   c                 P    dj                  d | j                  d      D              S )zl
    TitleCases a given string.

    Parameters
    ----------
    string : underscore separated string
     c              3   <   K   | ]  }|j                           y wr   )
capitalize).0xs     r   	<genexpr>ztitle_case.<locals>.<genexpr>t   s     =+<a1<<>+<s   _)joinsplit)strings    r   
title_caserT   l   s"     77=6<<+<===r   c                   &    e Zd ZdZi Zd Zd Zd Zy)ParamKwargsHelperz
    Utility class to help extract the subset of keys that an s3 method is
    actually using

    Parameters
    ----------
    s3 : boto S3FileSystem
    c                     || _         y r   r    )r   r!   s     r   r   zParamKwargsHelper.__init__   s	    r   c                 >   || j                   vr| j                  j                  j                  j	                  |      }|j
                  -t        |j
                  j                  j                               n	t               }|| j                   |<   | j                   |   S r   )	_kwarg_cacher!   metaservice_modeloperation_modelinput_shapesetmemberskeys)r   
model_namemodel
valid_keyss       r   _get_valid_keysz!ParamKwargsHelper._get_valid_keys   s    T...GGLL..>>zJE $$0 E%%--2245U 
 -7Dj)  ,,r   c                     t        |      }| j                  |      }t        |t              r|j	                         }|j                         D ci c]  \  }}||v s|| c}}S c c}}w r   )rT   rd   
isinstance	SSEParams	to_kwargsitems)r   method_namedra   rc   kvs          r   filter_dictzParamKwargsHelper.filter_dict   s]    ,
))*5
a#A!">Aa:o1>>>s   A&A&N)r:   r;   r<   rF   rY   r   rd   rn   r	   r   r   rV   rV   w   s     L	-?r   rV   c                   "    e Zd Z	 	 	 	 ddZd Zy)rg   Nc                 <    || _         || _        || _        || _        y r   )ServerSideEncryptionSSECustomerAlgorithmSSECustomerKeySSEKMSKeyId)r   server_side_encryptionsse_customer_algorithmsse_customer_keysse_kms_key_ids        r   r   zSSEParams.__init__   s$     %;!$:!.)r   c                 p    | j                   j                         D ci c]  \  }}|	|| c}}S c c}}w r   )__dict__ri   )r   rl   rm   s      r   rh   zSSEParams.to_kwargs   s5    !%!4!4!6H!6A!-1!6HHHs   
22)NNNN)r:   r;   r<   r   rh   r	   r   r   rg   rg      s      $#
*Ir   rg   c              #   b   K   t        d| |      D ]  }|t        ||z   dz
  | dz
        f  yw)z
    Chunk up a file into zero-based byte ranges

    Parameters
    ----------
    size : file size
    block : block size
    r      N)rangemin)sizeblockoffsets      r   _get_branger      s:      4'c&5.1,dQh777 (s   -/)rC   logging
contextlibr   r   botocore.exceptionsr   	getLoggerr&   r   r   IOErrorr>   rT   objectrV   rg   r   r	   r   r   <module>r      sw      5 + 
		6	"  F FR
' 
">? ?DI I"
8r   