"""S3 connector.""" from io import StringIO from tempfile import NamedTemporaryFile from typing import Any, Dict import boto3 s3_client = boto3.client('s3') def download_file( bucket_name: str, file_path: str, expected_bucket_owner: str | None = None ) -> StringIO: """Download file from specified s3 bucket.""" params: Dict[str, Any] = { 'Bucket': bucket_name, 'Key': file_path, } if expected_bucket_owner: params['ExpectedBucketOwner'] = expected_bucket_owner result = s3_client.get_object(**params) return StringIO(result['Body'].read().decode('utf-8')) def upload_file( bucket_name: str, file_path: str, buffer: StringIO, metadata: dict[str, str] | None = None, tags: dict[str, str] | None = None, expected_bucket_owner: str | None = None, ) -> None: """Upload file to specified s3 bucket.""" params: Dict[str, Any] = { 'Bucket': bucket_name, 'Key': file_path, 'Body': buffer.getvalue().encode('utf-8'), } if metadata: params['Metadata'] = metadata if tags: params['Tagging'] = '&'.join(f'{key}={value}' for key, value in tags.items()) if expected_bucket_owner: params['ExpectedBucketOwner'] = expected_bucket_owner s3_client.put_object(**params)