Skip to content

Commit 1d92881

Browse files
⬆️ Upgrade libraries (pydantic v2) (#6366)
1 parent 19e3923 commit 1d92881

File tree

286 files changed

+3271
-2646
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

286 files changed

+3271
-2646
lines changed

ci/helpers/requirements.txt

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
# This file was autogenerated by uv via the following command:
2-
# uv pip compile requirements.in
2+
# uv pip compile requirements.in -o requirements.txt
33
aiohttp==3.9.5
4+
# via
5+
# -c ../../requirements/constraints.txt
6+
# -r requirements.in
47
aiosignal==1.3.1
58
# via aiohttp
9+
annotated-types==0.7.0
10+
# via pydantic
611
anyio==4.3.0
712
# via starlette
8-
async-timeout==4.0.3
9-
# via aiohttp
1013
attrs==23.2.0
1114
# via aiohttp
12-
exceptiongroup==1.2.1
13-
# via anyio
14-
fastapi==0.99.1
15+
fastapi==0.115.0
16+
# via -r requirements.in
1517
frozenlist==1.4.1
1618
# via
1719
# aiohttp
@@ -24,16 +26,22 @@ multidict==6.0.5
2426
# via
2527
# aiohttp
2628
# yarl
27-
pydantic==1.10.15
28-
# via fastapi
29+
pydantic==2.9.2
30+
# via
31+
# -c ../../requirements/constraints.txt
32+
# fastapi
33+
pydantic-core==2.23.4
34+
# via pydantic
2935
sniffio==1.3.1
3036
# via anyio
31-
starlette==0.27.0
32-
# via fastapi
37+
starlette==0.38.6
38+
# via
39+
# -c ../../requirements/constraints.txt
40+
# fastapi
3341
typing-extensions==4.11.0
3442
# via
35-
# anyio
3643
# fastapi
3744
# pydantic
45+
# pydantic-core
3846
yarl==1.9.4
3947
# via aiohttp

packages/aws-library/requirements/_base.txt

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ aiormq==6.8.0
3232
# via aio-pika
3333
aiosignal==1.3.1
3434
# via aiohttp
35+
annotated-types==0.7.0
36+
# via pydantic
3537
anyio==4.4.0
3638
# via
3739
# fast-depends
@@ -105,7 +107,7 @@ orjson==3.10.7
105107
# -r requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/_base.in
106108
pamqp==3.3.0
107109
# via aiormq
108-
pydantic==1.10.17
110+
pydantic==2.9.1
109111
# via
110112
# -c requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt
111113
# -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt
@@ -120,6 +122,20 @@ pydantic==1.10.17
120122
# -r requirements/../../../packages/settings-library/requirements/_base.in
121123
# -r requirements/_base.in
122124
# fast-depends
125+
# pydantic-extra-types
126+
# pydantic-settings
127+
pydantic-core==2.23.3
128+
# via pydantic
129+
pydantic-extra-types==2.9.0
130+
# via
131+
# -r requirements/../../../packages/models-library/requirements/_base.in
132+
# -r requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/_base.in
133+
pydantic-settings==2.5.2
134+
# via
135+
# -r requirements/../../../packages/models-library/requirements/_base.in
136+
# -r requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/_base.in
137+
# -r requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/_base.in
138+
# -r requirements/../../../packages/settings-library/requirements/_base.in
123139
pygments==2.18.0
124140
# via rich
125141
pyinstrument==4.7.2
@@ -128,6 +144,8 @@ python-dateutil==2.9.0.post0
128144
# via
129145
# arrow
130146
# botocore
147+
python-dotenv==1.0.1
148+
# via pydantic-settings
131149
pyyaml==6.0.2
132150
# via
133151
# -c requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt
@@ -198,6 +216,7 @@ typing-extensions==4.12.2
198216
# aiodebug
199217
# faststream
200218
# pydantic
219+
# pydantic-core
201220
# typer
202221
# types-aiobotocore
203222
# types-aiobotocore-ec2

packages/aws-library/requirements/_test.txt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
annotated-types==0.7.0
2+
# via
3+
# -c requirements/_base.txt
4+
# pydantic
15
antlr4-python3-runtime==4.13.2
26
# via moto
37
appdirs==1.4.4
@@ -151,11 +155,15 @@ py-partiql-parser==0.5.5
151155
# via moto
152156
pycparser==2.22
153157
# via cffi
154-
pydantic==1.10.17
158+
pydantic==2.9.1
155159
# via
156160
# -c requirements/../../../requirements/constraints.txt
157161
# -c requirements/_base.txt
158162
# aws-sam-translator
163+
pydantic-core==2.23.3
164+
# via
165+
# -c requirements/_base.txt
166+
# pydantic
159167
pyparsing==3.1.2
160168
# via moto
161169
pytest==8.3.2
@@ -193,7 +201,9 @@ python-dateutil==2.9.0.post0
193201
# faker
194202
# moto
195203
python-dotenv==1.0.1
196-
# via -r requirements/_test.in
204+
# via
205+
# -c requirements/_base.txt
206+
# -r requirements/_test.in
197207
pyyaml==6.0.2
198208
# via
199209
# -c requirements/../../../requirements/constraints.txt
@@ -268,6 +278,7 @@ typing-extensions==4.12.2
268278
# flexparser
269279
# pint
270280
# pydantic
281+
# pydantic-core
271282
# types-aioboto3
272283
# types-aiobotocore
273284
urllib3==2.2.2

packages/aws-library/requirements/ci.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@
1111
--requirement _test.txt
1212

1313
# installs this repo's packages
14+
simcore-common-library @ ../common-library
15+
simcore-models-library @ ../models-library/
1416
pytest-simcore @ ../pytest-simcore
15-
simcore-models-library @ ../models-library
1617
simcore-service-library @ ../service-library/
1718
simcore-settings-library @ ../settings-library/
1819

packages/aws-library/requirements/dev.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@
1212
--requirement _tools.txt
1313

1414
# installs this repo's packages
15-
--editable ../pytest-simcore
15+
--editable ../common-library/
1616
--editable ../models-library/
17+
--editable ../pytest-simcore/
1718
--editable ../service-library/
1819
--editable ../settings-library/
1920

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
from ._client import SimcoreEC2API
22
from ._errors import EC2AccessError, EC2NotConnectedError, EC2RuntimeError
33
from ._models import (
4+
AWS_TAG_KEY_MAX_LENGTH,
5+
AWS_TAG_KEY_MIN_LENGTH,
6+
AWS_TAG_VALUE_MAX_LENGTH,
7+
AWS_TAG_VALUE_MIN_LENGTH,
48
AWSTagKey,
59
AWSTagValue,
610
EC2InstanceBootSpecific,
@@ -14,6 +18,10 @@
1418
__all__: tuple[str, ...] = (
1519
"AWSTagKey",
1620
"AWSTagValue",
21+
"AWS_TAG_KEY_MIN_LENGTH",
22+
"AWS_TAG_KEY_MAX_LENGTH",
23+
"AWS_TAG_VALUE_MIN_LENGTH",
24+
"AWS_TAG_VALUE_MAX_LENGTH",
1725
"EC2AccessError",
1826
"EC2InstanceBootSpecific",
1927
"EC2InstanceConfig",

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

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
# pylint: disable=too-many-ancestors
2-
from typing import Any
3-
4-
from models_library.errors_classes import OsparcErrorMixin
2+
from common_library.errors_classes import OsparcErrorMixin
53

64

75
class EC2BaseError(OsparcErrorMixin, Exception):
8-
def __init__(self, **ctx: Any) -> None:
9-
super().__init__(**ctx)
6+
pass
107

118

129
class EC2RuntimeError(EC2BaseError, RuntimeError):

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

Lines changed: 49 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,19 @@
22
import re
33
import tempfile
44
from dataclasses import dataclass
5-
from typing import Any, ClassVar, TypeAlias
5+
from typing import Annotated, Final, TypeAlias
66

77
import sh # type: ignore[import-untyped]
88
from models_library.docker import DockerGenericTag
99
from pydantic import (
1010
BaseModel,
1111
ByteSize,
12-
ConstrainedStr,
12+
ConfigDict,
1313
Field,
1414
NonNegativeFloat,
1515
NonNegativeInt,
16-
validator,
16+
StringConstraints,
17+
field_validator,
1718
)
1819
from types_aiobotocore_ec2.literals import InstanceStateNameType, InstanceTypeType
1920

@@ -33,26 +34,26 @@ def __gt__(self, other: "Resources") -> bool:
3334
return self.cpus > other.cpus or self.ram > other.ram
3435

3536
def __add__(self, other: "Resources") -> "Resources":
36-
return Resources.construct(
37+
return Resources.model_construct(
3738
**{
3839
key: a + b
3940
for (key, a), b in zip(
40-
self.dict().items(), other.dict().values(), strict=True
41+
self.model_dump().items(), other.model_dump().values(), strict=True
4142
)
4243
}
4344
)
4445

4546
def __sub__(self, other: "Resources") -> "Resources":
46-
return Resources.construct(
47+
return Resources.model_construct(
4748
**{
4849
key: a - b
4950
for (key, a), b in zip(
50-
self.dict().items(), other.dict().values(), strict=True
51+
self.model_dump().items(), other.model_dump().values(), strict=True
5152
)
5253
}
5354
)
5455

55-
@validator("cpus", pre=True)
56+
@field_validator("cpus", mode="before")
5657
@classmethod
5758
def _floor_cpus_to_0(cls, v: float) -> float:
5859
return max(v, 0)
@@ -67,19 +68,31 @@ class EC2InstanceType:
6768
InstancePrivateDNSName: TypeAlias = str
6869

6970

70-
class AWSTagKey(ConstrainedStr):
71+
AWS_TAG_KEY_MIN_LENGTH: Final[int] = 1
72+
AWS_TAG_KEY_MAX_LENGTH: Final[int] = 128
73+
AWSTagKey: TypeAlias = Annotated[
7174
# see [https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#tag-restrictions]
72-
regex = re.compile(r"^(?!(_index|\.{1,2})$)[a-zA-Z0-9\+\-=\._:@]+$")
73-
min_length = 1
74-
max_length = 128
75-
76-
77-
class AWSTagValue(ConstrainedStr):
75+
str,
76+
StringConstraints(
77+
min_length=AWS_TAG_KEY_MIN_LENGTH,
78+
max_length=AWS_TAG_KEY_MAX_LENGTH,
79+
pattern=re.compile(r"^(?!(_index|\.{1,2})$)[a-zA-Z0-9\+\-=\._:@]+$"),
80+
),
81+
]
82+
83+
84+
AWS_TAG_VALUE_MIN_LENGTH: Final[int] = 0
85+
AWS_TAG_VALUE_MAX_LENGTH: Final[int] = 256
86+
AWSTagValue: TypeAlias = Annotated[
7887
# see [https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#tag-restrictions]
7988
# quotes []{} were added as it allows to json encode. it seems to be accepted as a value
80-
regex = re.compile(r"^[a-zA-Z0-9\s\+\-=\.,_:/@\"\'\[\]\{\}]*$")
81-
min_length = 0
82-
max_length = 256
89+
str,
90+
StringConstraints(
91+
min_length=0,
92+
max_length=256,
93+
pattern=r"^[a-zA-Z0-9\s\+\-=\.,_:/@\"\'\[\]\{\}]*$",
94+
),
95+
]
8396

8497

8598
EC2Tags: TypeAlias = dict[AWSTagKey, AWSTagValue]
@@ -148,8 +161,23 @@ class EC2InstanceBootSpecific(BaseModel):
148161
default=0, description="number of buffer EC2s to keep (defaults to 0)"
149162
)
150163

151-
class Config:
152-
schema_extra: ClassVar[dict[str, Any]] = {
164+
@field_validator("custom_boot_scripts")
165+
@classmethod
166+
def validate_bash_calls(cls, v):
167+
try:
168+
with tempfile.NamedTemporaryFile(mode="wt", delete=True) as temp_file:
169+
temp_file.writelines(v)
170+
temp_file.flush()
171+
# NOTE: this will not capture runtime errors, but at least some syntax errors such as invalid quotes
172+
sh.bash("-n", temp_file.name)
173+
except sh.ErrorReturnCode as exc:
174+
msg = f"Invalid bash call in custom_boot_scripts: {v}, Error: {exc.stderr}"
175+
raise ValueError(msg) from exc
176+
177+
return v
178+
179+
model_config = ConfigDict(
180+
json_schema_extra={
153181
"examples": [
154182
{
155183
# just AMI
@@ -205,18 +233,4 @@ class Config:
205233
},
206234
]
207235
}
208-
209-
@validator("custom_boot_scripts")
210-
@classmethod
211-
def validate_bash_calls(cls, v):
212-
try:
213-
with tempfile.NamedTemporaryFile(mode="wt", delete=True) as temp_file:
214-
temp_file.writelines(v)
215-
temp_file.flush()
216-
# NOTE: this will not capture runtime errors, but at least some syntax errors such as invalid quotes
217-
sh.bash("-n", temp_file.name)
218-
except sh.ErrorReturnCode as exc:
219-
msg = f"Invalid bash call in custom_boot_scripts: {v}, Error: {exc.stderr}"
220-
raise ValueError(msg) from exc
221-
222-
return v
236+
)

0 commit comments

Comments
 (0)