Ë
    ÿÿæiÒ  ã                  óö   — U d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	 erd dlm
Z
 d dlmZ  e«       5 Zd dlZd dlmZ ddd«        G d	„ d
«      Zdd„Zerd dlmZ  ed«      Zded<   yy# 1 sw Y   Œ.xY w)é    )ÚannotationsN)ÚTYPE_CHECKING)Ú
try_import)ÚArtifactNotFound)ÚBinaryIO)ÚS3Client)ÚClientErrorc                  óH   — e Zd ZdZ	 d	ddœ	 	 	 	 	 	 	 d
d„Zdd„Zdd„Zdd„Zy)ÚBoto3ArtifactStorea›  An artifact backend for Boto3.

    Args:
        bucket_name:
            The name of the bucket to store artifacts.

        client:
            A Boto3 client to use for storage operations. If not specified, a new client will
            be created.

        avoid_buf_copy:
            If True, skip procedure to copy the content of the source file object to a buffer
            before uploading it to S3 ins. This is default to False because using
            ``upload_fileobj()`` method of Boto3 client might close the source file object.

    Example:
        .. code-block:: python

            import optuna
            from optuna.artifacts import upload_artifact
            from optuna.artifacts import Boto3ArtifactStore


            artifact_store = Boto3ArtifactStore("my-bucket")


            def objective(trial: optuna.Trial) -> float:
                ... = trial.suggest_float("x", -10, 10)
                file_path = generate_example(...)
                upload_artifact(
                    artifact_store=artifact_store,
                    file_path=file_path,
                    study_or_trial=trial,
                )
                return ...
    NF)Úavoid_buf_copyc               ó„   — t         j                  «        || _        |xs t        j                  d«      | _        || _        y )NÚs3)Ú_importsÚcheckÚbucketÚboto3ÚclientÚ_avoid_buf_copy)ÚselfÚbucket_namer   r   s       úl/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/optuna/artifacts/_boto3.pyÚ__init__zBoto3ArtifactStore.__init__;   s4   € ô 	�‰ÔØ!ˆŒØÒ2¤§¡¨TÓ 2ˆŒð  .ˆÕó    c                óô   — 	 | j                   j                  | j                  |¬«      }|j                  d«      }|€J ‚|S # t        $ r.}t	        |«      rt        d| j                  › d|› d�«      |‚‚ d }~ww xY w)N©ÚBucketÚKeyzArtifact storage with bucket: z, artifact_id: z was not foundÚBody)r   Ú
get_objectr   r	   Ú_is_not_found_errorr   Úget)r   Úartifact_idÚobjÚeÚbodys        r   Úopen_readerzBoto3ArtifactStore.open_readerE   s“   € ð	Ø—+‘+×(Ñ(°·±ÀÐ(ÓMˆCð �w‰w�v‹ˆØÐÐÐØˆøô ò 	Ü" 1Ô%Ü&Ø4°T·[±[°MÀÐQ\ÐP]ð ^!ð !óð ðð ûð	ús   ‚'A  Á 	A7Á	)A2Á2A7c                óè   — |}| j                   s=t        j                  «       }t        j                  ||«       |j                  d«       |}| j                  j                  || j                  |«       y )Nr   )	r   ÚioÚBytesIOÚshutilÚcopyfileobjÚseekr   Úupload_fileobjr   )r   r"   Úcontent_bodyÚfsrcÚbufs        r   ÚwritezBoto3ArtifactStore.writeS   sU   € Ø%ˆØ×#Ò#Ü—*‘*“,ˆCÜ×Ñ˜|¨SÔ1Ø�H‰H�QŒKØˆDØ�‰×"Ñ" 4¨¯©°kÕBr   c                óR   — | j                   j                  | j                  |¬«       y )Nr   )r   Údelete_objectr   )r   r"   s     r   ÚremovezBoto3ArtifactStore.remove\   s   € Ø�‰×!Ñ!¨¯©¸+Ð!ÕFr   )N)r   Ústrr   zS3Client | Noner   ÚboolÚreturnÚNone)r"   r5   r7   r   )r"   r5   r.   r   r7   r8   )r"   r5   r7   r8   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r&   r1   r4   © r   r   r   r      sK   „ ñ#ðL ;?ð.ØZ_ñ.Øð.Ø(7ð.ØSWð.à	ó.óóCôGr   r   c                óÆ   — | j                   j                  di «      j                  d«      }| j                   j                  di «      j                  d«      }|dk(  xs |dk(  S )NÚErrorÚCodeÚResponseMetadataÚHTTPStatusCodeÚ	NoSuchKeyi”  )Úresponser!   )r$   Ú
error_codeÚhttp_status_codes      r   r    r    `   sY   € Ø—‘—‘ ¨Ó,×0Ñ0°Ó8€JØ—z‘z—~‘~Ð&8¸"Ó=×AÑAÐBRÓSÐØ˜Ñ$Ò?Ð(8¸CÑ(?Ð?r   )ÚArtifactStoreÚ rG   Ú_)r$   r	   r7   r6   )Ú
__future__r   r(   r*   Útypingr   Úoptuna._importsr   Úoptuna.artifacts.exceptionsr   r   Úmypy_boto3_s3r   r   r   Úbotocore.exceptionsr	   r   r    Úoptuna.artifacts._protocolrG   rI   Ú__annotations__r=   r   r   Ú<module>rR      sp   ðÞ "ã 	Û Ý  å &Ý 8ñ Ýå&á„\�XÛÝ/÷ ÷
HGñ HGóV@ñ õ 9á)¨"Ó-€A€}Ô-ð ÷m €\ús   ·A/Á/A8