Skip to content

Commit a169f73

Browse files
author
Andrei Neagu
committed
refactor
1 parent d6ca255 commit a169f73

File tree

3 files changed

+29
-13
lines changed

3 files changed

+29
-13
lines changed

packages/aws-library/src/aws_library/s3/_client.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from pydantic import AnyUrl, ByteSize, TypeAdapter
2020
from servicelib.bytes_iters import DEFAULT_READ_CHUNK_SIZE, BytesStreamer
2121
from servicelib.logging_utils import log_catch, log_context
22-
from servicelib.s3_utils import FileLikeBytesIterReader
22+
from servicelib.s3_utils import FileLikeReader
2323
from servicelib.utils import limited_gather
2424
from settings_library.s3 import S3Settings
2525
from types_aiobotocore_s3 import S3Client
@@ -515,14 +515,14 @@ async def _() -> BytesIter:
515515
return BytesStreamer(data_size, _)
516516

517517
@s3_exception_handler(_logger)
518-
async def upload_object_from_bytes_iter( # TODO: this needs to be based on file interface -> use protocol to expose read
518+
async def upload_object_from_file_like(
519519
self,
520520
bucket_name: S3BucketName,
521521
object_key: S3ObjectKey,
522-
bytes_iter: BytesIter,
522+
file_like_reader: FileLikeReader,
523523
) -> None:
524524
"""streams write an object in S3 from an AsyncIterable[bytes]"""
525-
await self._client.upload_fileobj(FileLikeBytesIterReader(bytes_iter), bucket_name, object_key) # type: ignore[arg-type]
525+
await self._client.upload_fileobj(file_like_reader, bucket_name, object_key) # type: ignore[arg-type]
526526

527527
@staticmethod
528528
def is_multipart(file_size: ByteSize) -> bool:

packages/aws-library/tests/test_s3_client.py

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
from servicelib.bytes_iters._models import DataSize
6565
from servicelib.file_utils import remove_directory
6666
from servicelib.progress_bar import ProgressBarData
67+
from servicelib.s3_utils import FileLikeBytesIterReader
6768
from servicelib.utils import limited_as_completed, limited_gather
6869
from settings_library.s3 import S3Settings
6970
from types_aiobotocore_s3 import S3Client
@@ -1417,7 +1418,7 @@ async def test_read_object_file_stream(
14171418
await assert_same_file_content(with_uploaded_file_on_s3.local_path, tmp_file_name)
14181419

14191420

1420-
async def test_upload_object_from_file_stream(
1421+
async def test_upload_object_from_file_like(
14211422
mocked_s3_server_envs: EnvVarsDict,
14221423
with_uploaded_file_on_s3: UploadedFile,
14231424
simcore_s3_api: SimcoreS3API,
@@ -1429,10 +1430,14 @@ async def test_upload_object_from_file_stream(
14291430
)
14301431
assert isinstance(bytes_streamer.data_size, DataSize)
14311432

1432-
await simcore_s3_api.upload_object_from_bytes_iter(
1433-
with_s3_bucket, object_key, bytes_streamer.with_progress_bytes_iter(AsyncMock())
1433+
await simcore_s3_api.upload_object_from_file_like(
1434+
with_s3_bucket,
1435+
object_key,
1436+
FileLikeBytesIterReader(bytes_streamer.with_progress_bytes_iter(AsyncMock())),
14341437
)
14351438

1439+
# TODO: also add a test uploading form a file instead of S3 since it's possible, open it with aiofiles
1440+
14361441
await simcore_s3_api.delete_object(bucket=with_s3_bucket, object_key=object_key)
14371442

14381443

@@ -1589,13 +1594,15 @@ async def test_workflow_compress_s3_objects_and_local_files_in_a_single_archive_
15891594
progress_report_cb=mocked_progress_bar_cb,
15901595
description="root_bar",
15911596
) as progress_bar:
1592-
await simcore_s3_api.upload_object_from_bytes_iter(
1597+
await simcore_s3_api.upload_object_from_file_like(
15931598
with_s3_bucket,
15941599
archive_s3_object_key,
1595-
get_zip_bytes_iter(
1596-
archive_entries,
1597-
progress_bar=progress_bar,
1598-
chunk_size=MULTIPART_COPY_THRESHOLD,
1600+
FileLikeBytesIterReader(
1601+
get_zip_bytes_iter(
1602+
archive_entries,
1603+
progress_bar=progress_bar,
1604+
chunk_size=MULTIPART_COPY_THRESHOLD,
1605+
)
15991606
),
16001607
)
16011608

packages/service-library/src/servicelib/s3_utils.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
1+
from typing import Protocol
2+
13
from models_library.bytes_iters import BytesIter
24

35

4-
class FileLikeBytesIterReader:
6+
class FileLikeReader(Protocol):
7+
"""minimal interface for upload from file objects to S3"""
8+
9+
async def read(self, size: int) -> bytes:
10+
...
11+
12+
13+
class FileLikeBytesIterReader(FileLikeReader):
514
def __init__(self, bytes_iter: BytesIter):
615
self._bytes_iter = bytes_iter
716
self._buffer = bytearray()

0 commit comments

Comments
 (0)