1111 BaseStore ,
1212)
1313
14- # HTTP status code for not found errors
1514HTTP_NOT_FOUND = 404
1615
1716# S3 key length limit is 1024 bytes
18- # We allocate space for collection, separator, and key
19- # Using 500 bytes for each allows for the separator and stays well under 1024
17+ # Allocating 500 bytes each for collection and key stays well under the limit
2018MAX_COLLECTION_LENGTH = 500
2119MAX_KEY_LENGTH = 500
2220
@@ -135,7 +133,7 @@ class S3Store(BaseContextManagerStore, BaseStore):
135133
136134 _bucket_name : str
137135 _endpoint_url : str | None
138- _raw_client : Any # S3 client from aioboto3
136+ _raw_client : Any
139137 _client : S3Client | None
140138
141139 @overload
@@ -286,32 +284,25 @@ async def _setup(self) -> None:
286284 from botocore .exceptions import ClientError
287285
288286 try :
289- # Check if bucket exists
290287 await self ._connected_client .head_bucket (Bucket = self ._bucket_name ) # pyright: ignore[reportUnknownMemberType]
291288 except ClientError as e :
292- # Only proceed with bucket creation if it's a 404/NoSuchBucket error
293289 error_code = e .response .get ("Error" , {}).get ("Code" , "" ) # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType]
294290 http_status = e .response .get ("ResponseMetadata" , {}).get ("HTTPStatusCode" , 0 ) # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType]
295291
296292 if error_code in ("404" , "NoSuchBucket" ) or http_status == HTTP_NOT_FOUND :
297- # Bucket doesn't exist, create it
298293 import contextlib
299294
300295 with contextlib .suppress (self ._connected_client .exceptions .BucketAlreadyOwnedByYou ): # pyright: ignore[reportUnknownMemberType]
301- # Build create_bucket parameters
302296 create_params : dict [str , Any ] = {"Bucket" : self ._bucket_name }
303-
304- # Get region from client metadata
305297 region_name = getattr (self ._connected_client .meta , "region_name" , None ) # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType]
306298
307- # For regions other than us-east-1, we need to specify LocationConstraint
308- # Skip this for custom endpoints (LocalStack, MinIO) which may not support it
299+ # For regions other than us-east-1, specify LocationConstraint
300+ # Skip for custom endpoints (LocalStack, MinIO) which may not support it
309301 if region_name and region_name != "us-east-1" and not self ._endpoint_url :
310302 create_params ["CreateBucketConfiguration" ] = {"LocationConstraint" : region_name }
311303
312304 await self ._connected_client .create_bucket (** create_params ) # pyright: ignore[reportUnknownMemberType]
313305 else :
314- # Re-raise authentication, permission, or other errors
315306 raise
316307
317308 def _get_s3_key (self , * , collection : str , key : str ) -> str :
@@ -327,7 +318,6 @@ def _get_s3_key(self, *, collection: str, key: str) -> str:
327318 Returns:
328319 The S3 object key in format: {collection}/{key}
329320 """
330- # Use the sanitization strategies from BaseStore
331321 sanitized_collection , sanitized_key = self ._sanitize_collection_and_key (collection = collection , key = key )
332322 return f"{ sanitized_collection } /{ sanitized_key } "
333323
@@ -354,17 +344,13 @@ async def _get_managed_entry(self, *, key: str, collection: str) -> ManagedEntry
354344 Key = s3_key ,
355345 )
356346
357- # Read the object body and ensure the streaming body is closed
358347 async with response ["Body" ] as stream : # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType]
359348 body_bytes = await stream .read () # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType]
360349 json_value = body_bytes .decode ("utf-8" ) # pyright: ignore[reportUnknownMemberType]
361350
362- # Deserialize to ManagedEntry
363351 managed_entry = self ._serialization_adapter .load_json (json_str = json_value )
364352
365- # Check for client-side expiration
366353 if managed_entry .is_expired :
367- # Entry expired, delete it and return None
368354 await self ._connected_client .delete_object ( # type: ignore[reportUnknownMemberType]
369355 Bucket = self ._bucket_name ,
370356 Key = s3_key ,
@@ -373,7 +359,6 @@ async def _get_managed_entry(self, *, key: str, collection: str) -> ManagedEntry
373359 return managed_entry # noqa: TRY300
374360
375361 except self ._connected_client .exceptions .NoSuchKey : # pyright: ignore[reportUnknownMemberType]
376- # Object doesn't exist
377362 return None
378363
379364 @override
@@ -399,7 +384,6 @@ async def _put_managed_entry(
399384 s3_key = self ._get_s3_key (collection = collection , key = key )
400385 json_value = self ._serialization_adapter .dump_json (entry = managed_entry )
401386
402- # Prepare metadata
403387 metadata : dict [str , str ] = {}
404388 if managed_entry .expires_at :
405389 metadata ["expires-at" ] = managed_entry .expires_at .isoformat ()
@@ -430,7 +414,6 @@ async def _delete_managed_entry(self, *, key: str, collection: str) -> bool:
430414 from botocore .exceptions import ClientError
431415
432416 try :
433- # Check if object exists before deletion
434417 await self ._connected_client .head_object ( # pyright: ignore[reportUnknownMemberType]
435418 Bucket = self ._bucket_name ,
436419 Key = s3_key ,
@@ -443,21 +426,17 @@ async def _delete_managed_entry(self, *, key: str, collection: str) -> bool:
443426 http_status = metadata .get ("HTTPStatusCode" , 0 ) # pyright: ignore[reportUnknownMemberType, reportUnknownVariableType]
444427
445428 if error_code in ("404" , "NoSuchKey" ) or http_status == HTTP_NOT_FOUND :
446- # Object doesn't exist
447429 return False
448430
449- # If AccessDenied on head_object, try delete anyway (delete-only IAM role)
450431 if error_code in ("403" , "AccessDenied" ):
451432 await self ._connected_client .delete_object ( # pyright: ignore[reportUnknownMemberType]
452433 Bucket = self ._bucket_name ,
453434 Key = s3_key ,
454435 )
455436 return True
456437
457- # Re-raise other errors (network, etc.)
458438 raise
459439
460- # Object exists, delete it
461440 await self ._connected_client .delete_object ( # pyright: ignore[reportUnknownMemberType]
462441 Bucket = self ._bucket_name ,
463442 Key = s3_key ,
0 commit comments