Skip to content

Commit 9d93d7e

Browse files
continue upgrading
1 parent 5debf98 commit 9d93d7e

File tree

15 files changed

+203
-92
lines changed

15 files changed

+203
-92
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ async def create(cls, settings: EC2Settings) -> "SimcoreEC2API":
4141
session = aioboto3.Session()
4242
session_client = session.client(
4343
"ec2",
44-
endpoint_url=str(settings.EC2_ENDPOINT),
44+
endpoint_url=settings.EC2_ENDPOINT,
4545
aws_access_key_id=settings.EC2_ACCESS_KEY_ID,
4646
aws_secret_access_key=settings.EC2_SECRET_ACCESS_KEY,
4747
region_name=settings.EC2_REGION_NAME,

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@
4343
_MAX_CONCURRENT_COPY: Final[int] = 4
4444
_AWS_MAX_ITEMS_PER_PAGE: Final[int] = 1000
4545

46+
_ANY_URL_ADAPTER: Final[TypeAdapter[AnyUrl]] = TypeAdapter(AnyUrl)
47+
_LIST_ANY_URL_ADAPTER: Final[TypeAdapter[list[AnyUrl]]] = TypeAdapter(list[AnyUrl])
48+
4649

4750
class UploadedBytesTransferredCallback(Protocol):
4851
def __call__(self, bytes_transferred: int, *, file_name: str) -> None:
@@ -70,7 +73,7 @@ async def create(
7073
session = aioboto3.Session()
7174
session_client = session.client(
7275
"s3",
73-
endpoint_url=str(settings.S3_ENDPOINT),
76+
endpoint_url=settings.S3_ENDPOINT,
7477
aws_access_key_id=settings.S3_ACCESS_KEY,
7578
aws_secret_access_key=settings.S3_SECRET_KEY,
7679
region_name=settings.S3_REGION,
@@ -260,8 +263,7 @@ async def create_single_presigned_download_link(
260263
Params={"Bucket": bucket, "Key": object_key},
261264
ExpiresIn=expiration_secs,
262265
)
263-
url: AnyUrl = TypeAdapter(AnyUrl).validate_python(generated_link)
264-
return url
266+
return _ANY_URL_ADAPTER.validate_python(generated_link)
265267

266268
@s3_exception_handler(_logger)
267269
async def create_single_presigned_upload_link(
@@ -274,8 +276,7 @@ async def create_single_presigned_upload_link(
274276
Params={"Bucket": bucket, "Key": object_key},
275277
ExpiresIn=expiration_secs,
276278
)
277-
url: AnyUrl = TypeAdapter(AnyUrl).validate_python(generated_link)
278-
return url
279+
return _ANY_URL_ADAPTER.validate_python(generated_link)
279280

280281
@s3_exception_handler(_logger)
281282
async def create_multipart_upload_links(
@@ -298,7 +299,7 @@ async def create_multipart_upload_links(
298299
# compute the number of links, based on the announced file size
299300
num_upload_links, chunk_size = compute_num_file_chunks(file_size)
300301
# now create the links
301-
upload_links = TypeAdapter(list[AnyUrl]).validate_python(
302+
upload_links = _LIST_ANY_URL_ADAPTER.validate_python(
302303
await asyncio.gather(
303304
*(
304305
self._client.generate_presigned_url(
@@ -472,7 +473,6 @@ def is_multipart(file_size: ByteSize) -> bool:
472473

473474
@staticmethod
474475
def compute_s3_url(*, bucket: S3BucketName, object_key: S3ObjectKey) -> AnyUrl:
475-
url: AnyUrl = TypeAdapter(AnyUrl).validate_python(
476+
return _ANY_URL_ADAPTER.validate_python(
476477
f"s3://{bucket}/{urllib.parse.quote(object_key)}"
477478
)
478-
return url

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,16 @@ async def create(cls, settings: SSMSettings) -> "SimcoreSSMAPI":
4949
session = aioboto3.Session()
5050
session_client = session.client(
5151
"ssm",
52-
endpoint_url=str(settings.SSM_ENDPOINT),
52+
endpoint_url=settings.SSM_ENDPOINT,
5353
aws_access_key_id=settings.SSM_ACCESS_KEY_ID.get_secret_value(),
5454
aws_secret_access_key=settings.SSM_SECRET_ACCESS_KEY.get_secret_value(),
5555
region_name=settings.SSM_REGION_NAME,
5656
)
5757
assert isinstance(session_client, ClientCreatorContext) # nosec
5858
exit_stack = contextlib.AsyncExitStack()
59-
ec2_client = cast(SSMClient, await exit_stack.enter_async_context(session_client))
59+
ec2_client = cast(
60+
SSMClient, await exit_stack.enter_async_context(session_client)
61+
)
6062
return cls(ec2_client, session, exit_stack)
6163

6264
async def close(self) -> None:

packages/aws-library/tests/test_ec2_models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,12 @@ def test_resources_create_as_empty():
110110
(
111111
Resources(cpus=0, ram=ByteSize(34)),
112112
Resources(cpus=1, ram=ByteSize(0)),
113-
Resources.construct(cpus=-1, ram=ByteSize(34)),
113+
Resources.model_construct(cpus=-1, ram=ByteSize(34)),
114114
),
115115
(
116116
Resources(cpus=0.1, ram=ByteSize(34)),
117117
Resources(cpus=1, ram=ByteSize(1)),
118-
Resources.construct(cpus=-0.9, ram=ByteSize(33)),
118+
Resources.model_construct(cpus=-0.9, ram=ByteSize(33)),
119119
),
120120
],
121121
)

packages/aws-library/tests/test_s3_client.py

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from collections.abc import AsyncIterator, Awaitable, Callable
1515
from dataclasses import dataclass
1616
from pathlib import Path
17-
from typing import Any
17+
from typing import Any, Final
1818

1919
import botocore.exceptions
2020
import pytest
@@ -49,6 +49,8 @@
4949
from types_aiobotocore_s3 import S3Client
5050
from types_aiobotocore_s3.literals import BucketLocationConstraintType
5151

52+
_BYTE_SIZE_ADAPTER: Final[TypeAdapter[ByteSize]] = TypeAdapter(ByteSize)
53+
5254

5355
@pytest.fixture
5456
async def simcore_s3_api(
@@ -111,7 +113,7 @@ async def _(
111113
file,
112114
MultiPartUploadLinks(
113115
upload_id="fake",
114-
chunk_size=TypeAdapter(ByteSize).validate_python(file.stat().st_size),
116+
chunk_size=_BYTE_SIZE_ADAPTER.validate_python(file.stat().st_size),
115117
urls=[presigned_url],
116118
),
117119
)
@@ -135,7 +137,7 @@ async def with_uploaded_file_on_s3(
135137
s3_client: S3Client,
136138
with_s3_bucket: S3BucketName,
137139
) -> AsyncIterator[UploadedFile]:
138-
test_file = create_file_of_size(TypeAdapter(ByteSize).validate_python("10Kib"))
140+
test_file = create_file_of_size(_BYTE_SIZE_ADAPTER.validate_python("10Kib"))
139141
await s3_client.upload_file(
140142
Filename=f"{test_file}",
141143
Bucket=with_s3_bucket,
@@ -590,7 +592,7 @@ async def test_undelete_file(
590592
assert file_metadata.size == with_uploaded_file_on_s3.local_path.stat().st_size
591593

592594
# upload another file on top of the existing one
593-
new_file = create_file_of_size(TypeAdapter(ByteSize).validate_python("5Kib"))
595+
new_file = create_file_of_size(_BYTE_SIZE_ADAPTER.validate_python("5Kib"))
594596
await s3_client.upload_file(
595597
Filename=f"{new_file}",
596598
Bucket=with_s3_bucket,
@@ -745,7 +747,7 @@ async def test_create_single_presigned_upload_link(
745747
[Path, AnyUrl, S3BucketName, S3ObjectKey], Awaitable[None]
746748
],
747749
):
748-
file = create_file_of_size(TypeAdapter(ByteSize).validate_python("1Mib"))
750+
file = create_file_of_size(_BYTE_SIZE_ADAPTER.validate_python("1Mib"))
749751
s3_object_key = file.name
750752
presigned_url = await simcore_s3_api.create_single_presigned_upload_link(
751753
bucket=with_s3_bucket,
@@ -773,7 +775,7 @@ async def test_create_single_presigned_upload_link_with_non_existing_bucket_rais
773775
create_file_of_size: Callable[[ByteSize], Path],
774776
default_expiration_time_seconds: int,
775777
):
776-
file = create_file_of_size(TypeAdapter(ByteSize).validate_python("1Mib"))
778+
file = create_file_of_size(_BYTE_SIZE_ADAPTER.validate_python("1Mib"))
777779
s3_object_key = file.name
778780
with pytest.raises(S3BucketInvalidError):
779781
await simcore_s3_api.create_single_presigned_upload_link(
@@ -1080,7 +1082,7 @@ async def test_copy_file_invalid_raises(
10801082
create_file_of_size: Callable[[ByteSize], Path],
10811083
faker: Faker,
10821084
):
1083-
file = create_file_of_size(TypeAdapter(ByteSize).validate_python("1MiB"))
1085+
file = create_file_of_size(_BYTE_SIZE_ADAPTER.validate_python("1MiB"))
10841086
uploaded_file = await upload_file(file)
10851087
dst_object_key = faker.file_name()
10861088
# NOTE: since aioboto3 13.1.0 this raises S3KeyNotFoundError instead of S3BucketInvalidError
@@ -1105,9 +1107,9 @@ async def test_copy_file_invalid_raises(
11051107
"directory_size, min_file_size, max_file_size",
11061108
[
11071109
(
1108-
TypeAdapter(ByteSize).validate_python("1Mib"),
1109-
TypeAdapter(ByteSize).validate_python("1B"),
1110-
TypeAdapter(ByteSize).validate_python("10Kib"),
1110+
_BYTE_SIZE_ADAPTER.validate_python("1Mib"),
1111+
_BYTE_SIZE_ADAPTER.validate_python("1B"),
1112+
_BYTE_SIZE_ADAPTER.validate_python("10Kib"),
11111113
)
11121114
],
11131115
ids=byte_size_ids,
@@ -1131,9 +1133,9 @@ async def test_get_directory_metadata(
11311133
"directory_size, min_file_size, max_file_size",
11321134
[
11331135
(
1134-
TypeAdapter(ByteSize).validate_python("1Mib"),
1135-
TypeAdapter(ByteSize).validate_python("1B"),
1136-
TypeAdapter(ByteSize).validate_python("10Kib"),
1136+
_BYTE_SIZE_ADAPTER.validate_python("1Mib"),
1137+
_BYTE_SIZE_ADAPTER.validate_python("1B"),
1138+
_BYTE_SIZE_ADAPTER.validate_python("10Kib"),
11371139
)
11381140
],
11391141
ids=byte_size_ids,
@@ -1163,9 +1165,9 @@ async def test_get_directory_metadata_raises(
11631165
"directory_size, min_file_size, max_file_size",
11641166
[
11651167
(
1166-
TypeAdapter(ByteSize).validate_python("1Mib"),
1167-
TypeAdapter(ByteSize).validate_python("1B"),
1168-
TypeAdapter(ByteSize).validate_python("10Kib"),
1168+
_BYTE_SIZE_ADAPTER.validate_python("1Mib"),
1169+
_BYTE_SIZE_ADAPTER.validate_python("1B"),
1170+
_BYTE_SIZE_ADAPTER.validate_python("10Kib"),
11691171
)
11701172
],
11711173
ids=byte_size_ids,
@@ -1199,9 +1201,9 @@ async def test_delete_file_recursively(
11991201
"directory_size, min_file_size, max_file_size",
12001202
[
12011203
(
1202-
TypeAdapter(ByteSize).validate_python("1Mib"),
1203-
TypeAdapter(ByteSize).validate_python("1B"),
1204-
TypeAdapter(ByteSize).validate_python("10Kib"),
1204+
_BYTE_SIZE_ADAPTER.validate_python("1Mib"),
1205+
_BYTE_SIZE_ADAPTER.validate_python("1B"),
1206+
_BYTE_SIZE_ADAPTER.validate_python("10Kib"),
12051207
)
12061208
],
12071209
ids=byte_size_ids,
@@ -1237,9 +1239,9 @@ async def test_delete_file_recursively_raises(
12371239
"directory_size, min_file_size, max_file_size",
12381240
[
12391241
(
1240-
TypeAdapter(ByteSize).validate_python("1Mib"),
1241-
TypeAdapter(ByteSize).validate_python("1B"),
1242-
TypeAdapter(ByteSize).validate_python("10Kib"),
1242+
_BYTE_SIZE_ADAPTER.validate_python("1Mib"),
1243+
_BYTE_SIZE_ADAPTER.validate_python("1B"),
1244+
_BYTE_SIZE_ADAPTER.validate_python("10Kib"),
12431245
)
12441246
],
12451247
ids=byte_size_ids,
@@ -1337,14 +1339,14 @@ def run_async_test(*args, **kwargs) -> None:
13371339
"directory_size, min_file_size, max_file_size",
13381340
[
13391341
(
1340-
TypeAdapter(ByteSize).validate_python("1Mib"),
1341-
TypeAdapter(ByteSize).validate_python("1B"),
1342-
TypeAdapter(ByteSize).validate_python("10Kib"),
1342+
_BYTE_SIZE_ADAPTER.validate_python("1Mib"),
1343+
_BYTE_SIZE_ADAPTER.validate_python("1B"),
1344+
_BYTE_SIZE_ADAPTER.validate_python("10Kib"),
13431345
),
13441346
(
1345-
TypeAdapter(ByteSize).validate_python("500Mib"),
1346-
TypeAdapter(ByteSize).validate_python("10Mib"),
1347-
TypeAdapter(ByteSize).validate_python("50Mib"),
1347+
_BYTE_SIZE_ADAPTER.validate_python("500Mib"),
1348+
_BYTE_SIZE_ADAPTER.validate_python("10Mib"),
1349+
_BYTE_SIZE_ADAPTER.validate_python("50Mib"),
13481350
),
13491351
],
13501352
ids=byte_size_ids,

packages/aws-library/tests/test_s3_utils.py

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
# pylint: disable=unused-variable
55

66

7+
from typing import Final
8+
79
import pytest
810
from aws_library.s3._utils import (
911
_MULTIPART_MAX_NUMBER_OF_PARTS,
@@ -13,59 +15,61 @@
1315
from pydantic import ByteSize, TypeAdapter
1416
from pytest_simcore.helpers.parametrizations import byte_size_ids
1517

18+
_BYTE_SIZE_ADAPTER: Final[TypeAdapter[ByteSize]] = TypeAdapter(ByteSize)
19+
1620

1721
@pytest.mark.parametrize(
1822
"file_size, expected_num_chunks, expected_chunk_size",
1923
[
2024
(
21-
TypeAdapter(ByteSize).validate_python("5Mib"),
25+
_BYTE_SIZE_ADAPTER.validate_python("5Mib"),
2226
1,
23-
TypeAdapter(ByteSize).validate_python("10Mib"),
27+
_BYTE_SIZE_ADAPTER.validate_python("10Mib"),
2428
),
2529
(
26-
TypeAdapter(ByteSize).validate_python("10Mib"),
30+
_BYTE_SIZE_ADAPTER.validate_python("10Mib"),
2731
1,
28-
TypeAdapter(ByteSize).validate_python("10Mib"),
32+
_BYTE_SIZE_ADAPTER.validate_python("10Mib"),
2933
),
3034
(
31-
TypeAdapter(ByteSize).validate_python("20Mib"),
35+
_BYTE_SIZE_ADAPTER.validate_python("20Mib"),
3236
2,
33-
TypeAdapter(ByteSize).validate_python("10Mib"),
37+
_BYTE_SIZE_ADAPTER.validate_python("10Mib"),
3438
),
3539
(
36-
TypeAdapter(ByteSize).validate_python("50Mib"),
40+
_BYTE_SIZE_ADAPTER.validate_python("50Mib"),
3741
5,
38-
TypeAdapter(ByteSize).validate_python("10Mib"),
42+
_BYTE_SIZE_ADAPTER.validate_python("10Mib"),
3943
),
4044
(
41-
TypeAdapter(ByteSize).validate_python("150Mib"),
45+
_BYTE_SIZE_ADAPTER.validate_python("150Mib"),
4246
15,
43-
TypeAdapter(ByteSize).validate_python("10Mib"),
47+
_BYTE_SIZE_ADAPTER.validate_python("10Mib"),
4448
),
4549
(
46-
TypeAdapter(ByteSize).validate_python("550Mib"),
50+
_BYTE_SIZE_ADAPTER.validate_python("550Mib"),
4751
55,
48-
TypeAdapter(ByteSize).validate_python("10Mib"),
52+
_BYTE_SIZE_ADAPTER.validate_python("10Mib"),
4953
),
5054
(
51-
TypeAdapter(ByteSize).validate_python("560Gib"),
55+
_BYTE_SIZE_ADAPTER.validate_python("560Gib"),
5256
5735,
53-
TypeAdapter(ByteSize).validate_python("100Mib"),
57+
_BYTE_SIZE_ADAPTER.validate_python("100Mib"),
5458
),
5559
(
56-
TypeAdapter(ByteSize).validate_python("5Tib"),
60+
_BYTE_SIZE_ADAPTER.validate_python("5Tib"),
5761
8739,
58-
TypeAdapter(ByteSize).validate_python("600Mib"),
62+
_BYTE_SIZE_ADAPTER.validate_python("600Mib"),
5963
),
6064
(
61-
TypeAdapter(ByteSize).validate_python("15Tib"),
65+
_BYTE_SIZE_ADAPTER.validate_python("15Tib"),
6266
7680,
63-
TypeAdapter(ByteSize).validate_python("2Gib"),
67+
_BYTE_SIZE_ADAPTER.validate_python("2Gib"),
6468
),
6569
(
66-
TypeAdapter(ByteSize).validate_python("9431773844"),
70+
_BYTE_SIZE_ADAPTER.validate_python("9431773844"),
6771
900,
68-
TypeAdapter(ByteSize).validate_python("10Mib"),
72+
_BYTE_SIZE_ADAPTER.validate_python("10Mib"),
6973
),
7074
],
7175
ids=byte_size_ids,
@@ -79,7 +83,7 @@ def test_compute_num_file_chunks(
7983

8084

8185
def test_enormous_file_size_raises_value_error():
82-
enormous_file_size = TypeAdapter(ByteSize).validate_python(
86+
enormous_file_size = _BYTE_SIZE_ADAPTER.validate_python(
8387
(
8488
max(_MULTIPART_UPLOADS_TARGET_MAX_PART_SIZE)
8589
* _MULTIPART_MAX_NUMBER_OF_PARTS

packages/dask-task-models-library/src/dask_task_models_library/container_tasks/events.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,6 @@ def from_dask_worker(
5050
task_owner=task_owner,
5151
)
5252

53-
@field_validator("progress")
54-
@classmethod
55-
def ensure_between_0_1(cls, v):
56-
if 0 <= v <= 1:
57-
return v
58-
return min(max(0, v), 1)
59-
6053
model_config = ConfigDict(
6154
json_schema_extra={
6255
"examples": [
@@ -86,6 +79,13 @@ def ensure_between_0_1(cls, v):
8679
}
8780
)
8881

82+
@field_validator("progress")
83+
@classmethod
84+
def ensure_between_0_1(cls, v):
85+
if 0 <= v <= 1:
86+
return v
87+
return min(max(0, v), 1)
88+
8989

9090
LogMessageStr: TypeAlias = str
9191
LogLevelInt: TypeAlias = int

0 commit comments

Comments
 (0)