11import pathlib
22from enum import auto
3- from typing import Literal , Optional , Union
3+ from typing import Literal , Optional , Union , Tuple
44
55from dotenv import dotenv_values
66from pydantic import BaseModel , PrivateAttr , validator
@@ -310,13 +310,29 @@ class Queue(BaseModel):
310310 password : Optional [str ]
311311
312312
313+ class S3Credentials (BaseModel ):
314+ access_key_id : str
315+ secret_access_key : str
316+
317+ @validator ("access_key_id" )
318+ def validate_access_key_id (cls , field ):
319+ if field == "" :
320+ raise ValueError ("access_key_id cannot be empty" )
321+ return field
322+
323+ @validator ("secret_access_key" )
324+ def validate_secret_access_key (cls , field ):
325+ if field == "" :
326+ raise ValueError ("secret_access_key cannot be empty" )
327+ return field
328+
329+
313330class S3Config (BaseModel ):
314331 region_code : str
315332 bucket : str
316333 key_prefix : str
317334
318- access_key_id : Optional [str ] = None
319- secret_access_key : Optional [str ] = None
335+ credentials : Optional [S3Credentials ]
320336
321337 @validator ("region_code" )
322338 def validate_region_code (cls , field ):
@@ -338,6 +354,11 @@ def validate_key_prefix(cls, field):
338354 raise ValueError ('key_prefix must end with "/"' )
339355 return field
340356
357+ def get_credentials (self ) -> Tuple [Optional [str ], Optional [str ]]:
358+ if self .credentials is None :
359+ return None , None
360+ return self .credentials .access_key_id , self .credentials .secret_access_key
361+
341362
342363class FsStorage (BaseModel ):
343364 type : Literal [StorageType .FS .value ] = StorageType .FS .value
0 commit comments