Skip to content

Commit a1caf73

Browse files
continue fixing
1 parent 2aa3386 commit a1caf73

File tree

58 files changed

+301
-258
lines changed

Some content is hidden

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

58 files changed

+301
-258
lines changed

services/web/server/src/simcore_service_webserver/projects/projects_api.py

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
from models_library.utils.json_serialization import json_dumps
6464
from models_library.wallets import ZERO_CREDITS, WalletID, WalletInfo
6565
from models_library.workspaces import UserWorkspaceAccessRightsDB
66-
from pydantic import ByteSize, parse_obj_as
66+
from pydantic import ByteSize, TypeAdapter
6767
from servicelib.aiohttp.application_keys import APP_FIRE_AND_FORGET_TASKS_KEY
6868
from servicelib.common_headers import (
6969
UNDEFINED_DEFAULT_SIMCORE_USER_AGENT_VALUE,
@@ -376,7 +376,9 @@ async def _get_default_pricing_and_hardware_info(
376376
_MACHINE_TOTAL_RAM_SAFE_MARGIN_RATIO: Final[
377377
float
378378
] = 0.1 # NOTE: machines always have less available RAM than advertised
379-
_SIDECARS_OPS_SAFE_RAM_MARGIN: Final[ByteSize] = parse_obj_as(ByteSize, "1GiB")
379+
_SIDECARS_OPS_SAFE_RAM_MARGIN: Final[ByteSize] = TypeAdapter(ByteSize).validate_python(
380+
"1GiB"
381+
)
380382
_CPUS_SAFE_MARGIN: Final[float] = 1.4
381383
_MIN_NUM_CPUS: Final[float] = 0.5
382384

@@ -633,8 +635,8 @@ async def _start_dynamic_service(
633635
)
634636
if user_default_wallet_preference is None:
635637
raise UserDefaultWalletNotFoundError(uid=user_id)
636-
project_wallet_id = parse_obj_as(
637-
WalletID, user_default_wallet_preference.value
638+
project_wallet_id = TypeAdapter(WalletID).validate_python(
639+
user_default_wallet_preference.value
638640
)
639641
await connect_wallet_to_project(
640642
request.app,
@@ -1507,8 +1509,12 @@ async def is_service_deprecated(
15071509
app, user_id, service_key, service_version, product_name
15081510
)
15091511
if deprecation_date := service.get("deprecated"):
1510-
deprecation_date = parse_obj_as(datetime.datetime, deprecation_date)
1511-
deprecation_date_bool: bool = datetime.datetime.utcnow() > deprecation_date
1512+
deprecation_date = TypeAdapter(datetime.datetime).validate_python(
1513+
deprecation_date
1514+
)
1515+
deprecation_date_bool: bool = (
1516+
datetime.datetime.now(datetime.timezone.utc) > deprecation_date
1517+
)
15121518
return deprecation_date_bool
15131519
return False
15141520

@@ -1543,8 +1549,8 @@ async def get_project_node_resources(
15431549
db = ProjectDBAPI.get_from_app_context(app)
15441550
try:
15451551
project_node = await db.get_project_node(project_id, node_id)
1546-
node_resources = parse_obj_as(
1547-
ServiceResourcesDict, project_node.required_resources
1552+
node_resources = TypeAdapter(ServiceResourcesDict).validate_python(
1553+
project_node.required_resources
15481554
)
15491555
if not node_resources:
15501556
# get default resources
@@ -1573,8 +1579,8 @@ async def update_project_node_resources(
15731579
try:
15741580
# validate the resource are applied to the same container names
15751581
current_project_node = await db.get_project_node(project_id, node_id)
1576-
current_resources = parse_obj_as(
1577-
ServiceResourcesDict, current_project_node.required_resources
1582+
current_resources = TypeAdapter(ServiceResourcesDict).validate_python(
1583+
current_project_node.required_resources
15781584
)
15791585
if not current_resources:
15801586
# NOTE: this can happen after the migration
@@ -1594,7 +1600,9 @@ async def update_project_node_resources(
15941600
required_resources=jsonable_encoder(resources),
15951601
check_update_allowed=True,
15961602
)
1597-
return parse_obj_as(ServiceResourcesDict, project_node.required_resources)
1603+
return TypeAdapter(ServiceResourcesDict).validate_python(
1604+
project_node.required_resources
1605+
)
15981606
except ProjectNodesNodeNotFoundError as exc:
15991607
raise NodeNotFoundError(
16001608
project_uuid=f"{project_id}", node_uuid=f"{node_id}"
@@ -1863,4 +1871,4 @@ async def get_project_inactivity(
18631871
project_settings.PROJECTS_INACTIVITY_INTERVAL.total_seconds()
18641872
),
18651873
)
1866-
return parse_obj_as(GetProjectInactivityResponse, project_inactivity)
1874+
return TypeAdapter(GetProjectInactivityResponse).validate_python(project_inactivity)

services/web/server/src/simcore_service_webserver/projects/settings.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
from datetime import timedelta
22

33
from aiohttp import web
4-
from pydantic import ByteSize, Field, NonNegativeInt, parse_obj_as
4+
from pydantic import ByteSize, Field, NonNegativeInt, TypeAdapter
55
from settings_library.base import BaseCustomSettings
66

77
from .._constants import APP_SETTINGS_KEY
88

99

1010
class ProjectsSettings(BaseCustomSettings):
1111
PROJECTS_MAX_COPY_SIZE_BYTES: ByteSize = Field(
12-
parse_obj_as(ByteSize, "30Gib"),
12+
TypeAdapter(ByteSize).validate_python("30Gib"),
1313
description="defines the maximum authorized project data size"
1414
" when copying a project (disable with 0)",
1515
)

services/web/server/src/simcore_service_webserver/projects/utils.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from models_library.projects_nodes_io import NodeIDStr
99
from models_library.services import ServiceKey
10-
from pydantic import parse_obj_as
10+
from pydantic import TypeAdapter
1111
from servicelib.decorators import safe_return
1212
from yarl import URL
1313

@@ -378,7 +378,9 @@ def default_copy_project_name(name: str) -> str:
378378
new_copy_index = 1
379379
if current_copy_index := match.group(2):
380380
# we receive something of type "(23)"
381-
new_copy_index = parse_obj_as(int, current_copy_index.strip("()")) + 1
381+
new_copy_index = (
382+
TypeAdapter(int).validate_python(current_copy_index.strip("()")) + 1
383+
)
382384
return f"{match.group(1)}({new_copy_index})"
383385
return f"{name} (Copy)"
384386

services/web/server/src/simcore_service_webserver/resource_usage/_client.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from models_library.resource_tracker import PricingPlanId, PricingUnitId
2323
from models_library.users import UserID
2424
from models_library.wallets import WalletID
25-
from pydantic import NonNegativeInt, parse_obj_as
25+
from pydantic import NonNegativeInt, TypeAdapter
2626
from servicelib.aiohttp.client_session import get_client_session
2727
from settings_library.resource_usage_tracker import ResourceUsageTrackerSettings
2828
from yarl import URL
@@ -98,7 +98,7 @@ async def get_default_service_pricing_plan(
9898
async with session.get(url) as response:
9999
response.raise_for_status()
100100
body: dict = await response.json()
101-
return parse_obj_as(PricingPlanGet, body)
101+
return TypeAdapter(PricingPlanGet).validate_python(body)
102102

103103

104104
async def get_pricing_plan_unit(
@@ -123,7 +123,7 @@ async def get_pricing_plan_unit(
123123
async with session.get(url) as response:
124124
response.raise_for_status()
125125
body: dict = await response.json()
126-
return parse_obj_as(PricingUnitGet, body)
126+
return TypeAdapter(PricingUnitGet).validate_python(body)
127127

128128

129129
async def sum_total_available_credits_in_the_wallet(

services/web/server/src/simcore_service_webserver/resource_usage/_service_runs_handlers.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,15 @@
2222
from models_library.rest_pagination_utils import paginate_data
2323
from models_library.users import UserID
2424
from models_library.wallets import WalletID
25-
from pydantic import BaseModel, ConfigDict, Field, Json, NonNegativeInt, field_validator
25+
from pydantic import (
26+
BaseModel,
27+
ConfigDict,
28+
Field,
29+
Json,
30+
NonNegativeInt,
31+
TypeAdapter,
32+
field_validator,
33+
)
2634
from servicelib.aiohttp.requests_validation import parse_request_query_parameters_as
2735
from servicelib.aiohttp.typing_extension import Handler
2836
from servicelib.mimetype_constants import MIMETYPE_APPLICATION_JSON
@@ -156,8 +164,8 @@ async def list_resource_usage_services(request: web.Request):
156164
wallet_id=query_params.wallet_id,
157165
offset=query_params.offset,
158166
limit=query_params.limit,
159-
order_by=parse_obj_as(OrderBy, query_params.order_by),
160-
filters=parse_obj_as(ServiceResourceUsagesFilters | None, query_params.filters), # type: ignore[arg-type] # from pydantic v2 --> https://github.com/pydantic/pydantic/discussions/4950
167+
order_by=TypeAdapter(OrderBy).validate_python(query_params.order_by),
168+
filters=TypeAdapter(ServiceResourceUsagesFilters | None).validate_python(query_params.filters), # type: ignore[arg-type] # from pydantic v2 --> https://github.com/pydantic/pydantic/discussions/4950
161169
)
162170

163171
page = Page[dict[str, Any]].model_validate(
@@ -170,7 +178,7 @@ async def list_resource_usage_services(request: web.Request):
170178
)
171179
)
172180
return web.Response(
173-
text=page.json(**RESPONSE_MODEL_POLICY),
181+
text=page.model_dump_json(**RESPONSE_MODEL_POLICY),
174182
content_type=MIMETYPE_APPLICATION_JSON,
175183
)
176184

@@ -234,7 +242,7 @@ async def export_resource_usage_services(request: web.Request):
234242
user_id=req_ctx.user_id,
235243
product_name=req_ctx.product_name,
236244
wallet_id=query_params.wallet_id,
237-
order_by=parse_obj_as(OrderBy | None, query_params.order_by), # type: ignore[arg-type] # from pydantic v2 --> https://github.com/pydantic/pydantic/discussions/4950
238-
filters=parse_obj_as(ServiceResourceUsagesFilters | None, query_params.filters), # type: ignore[arg-type] # from pydantic v2 --> https://github.com/pydantic/pydantic/discussions/4950
245+
order_by=TypeAdapter(OrderBy | None).validate_python(query_params.order_by), # type: ignore[arg-type] # from pydantic v2 --> https://github.com/pydantic/pydantic/discussions/4950
246+
filters=TypeAdapter(ServiceResourceUsagesFilters | None).validate_python(query_params.filters), # type: ignore[arg-type] # from pydantic v2 --> https://github.com/pydantic/pydantic/discussions/4950
239247
)
240248
raise web.HTTPFound(location=f"{download_url}")

services/web/server/src/simcore_service_webserver/rest/_handlers.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
from aiohttp import web
1010
from models_library.utils.pydantic_tools_extension import FieldNotRequired
11-
from pydantic import BaseModel, parse_obj_as
11+
from pydantic import BaseModel, TypeAdapter
1212
from servicelib.aiohttp import status
1313

1414
from .._constants import APP_PUBLIC_CONFIG_PER_PRODUCT, APP_SETTINGS_KEY
@@ -104,7 +104,8 @@ async def get_scheduled_maintenance(request: web.Request):
104104

105105
if maintenance_data := await redis_client.get(hash_key):
106106
assert ( # nosec
107-
parse_obj_as(_ScheduledMaintenanceGet, maintenance_data) is not None
107+
TypeAdapter(_ScheduledMaintenanceGet).validate_python(maintenance_data)
108+
is not None
108109
)
109110
return envelope_json_response(maintenance_data)
110111

services/web/server/src/simcore_service_webserver/scicrunch/service_client.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import logging
99

1010
from aiohttp import ClientSession, client_exceptions, web
11-
from pydantic import HttpUrl, ValidationError, parse_obj_as
11+
from pydantic import HttpUrl, TypeAdapter, ValidationError
1212
from servicelib.aiohttp.client_session import get_client_session
1313
from yarl import URL
1414

@@ -90,8 +90,8 @@ def get_search_web_url(self, rrid: str) -> str:
9090

9191
def get_resolver_web_url(self, rrid: str) -> HttpUrl:
9292
# example https://scicrunch.org/resolver/RRID:AB_90755
93-
output: HttpUrl = parse_obj_as(
94-
HttpUrl, f"{self.settings.SCICRUNCH_RESOLVER_BASE_URL}/{rrid}"
93+
output: HttpUrl = TypeAdapter(HttpUrl).validate_python(
94+
f"{self.settings.SCICRUNCH_RESOLVER_BASE_URL}/{rrid}"
9595
)
9696
return output
9797

services/web/server/src/simcore_service_webserver/scicrunch/settings.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from aiohttp import web
2-
from pydantic import Field, HttpUrl, SecretStr, parse_obj_as
2+
from pydantic import Field, HttpUrl, SecretStr, TypeAdapter
33
from settings_library.base import BaseCustomSettings
44

55
from .._constants import APP_SETTINGS_KEY
@@ -11,7 +11,7 @@
1111
class SciCrunchSettings(BaseCustomSettings):
1212

1313
SCICRUNCH_API_BASE_URL: HttpUrl = Field(
14-
default=parse_obj_as(HttpUrl, f"{SCICRUNCH_DEFAULT_URL}/api/1"),
14+
default=TypeAdapter(HttpUrl).validate_python(f"{SCICRUNCH_DEFAULT_URL}/api/1"),
1515
description="Base url to scicrunch API's entrypoint",
1616
)
1717

@@ -20,7 +20,9 @@ class SciCrunchSettings(BaseCustomSettings):
2020
SCICRUNCH_API_KEY: SecretStr
2121

2222
SCICRUNCH_RESOLVER_BASE_URL: HttpUrl = Field(
23-
default=parse_obj_as(HttpUrl, f"{SCICRUNCH_DEFAULT_URL}/resolver"),
23+
default=TypeAdapter(HttpUrl).validate_python(
24+
f"{SCICRUNCH_DEFAULT_URL}/resolver"
25+
),
2426
description="Base url to scicrunch resolver entrypoint",
2527
)
2628

services/web/server/src/simcore_service_webserver/security/_authz_db.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from models_library.basic_types import IdInt
88
from models_library.products import ProductName
99
from models_library.users import UserID
10-
from pydantic import parse_obj_as
10+
from pydantic import TypeAdapter
1111
from simcore_postgres_database.models.groups import user_to_groups
1212
from simcore_postgres_database.models.products import products
1313
from simcore_postgres_database.models.users import UserRole
@@ -35,8 +35,12 @@ async def get_active_user_or_none(engine: Engine, email: str) -> AuthInfoDict |
3535
)
3636
)
3737
row = await result.fetchone()
38-
assert row is None or parse_obj_as(IdInt, row.id) is not None # nosec
39-
assert row is None or parse_obj_as(UserRole, row.role) is not None # nosec
38+
assert (
39+
row is None or TypeAdapter(IdInt).validate_python(row.id) is not None
40+
) # nosec
41+
assert (
42+
row is None or TypeAdapter(UserRole).validate_python(row.role) is not None
43+
) # nosec
4044

4145
return AuthInfoDict(id=row.id, role=row.role) if row else None
4246

services/web/server/src/simcore_service_webserver/storage/_handlers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
)
1515
from models_library.projects_nodes_io import LocationID
1616
from models_library.utils.fastapi_encoders import jsonable_encoder
17-
from pydantic import AnyUrl, BaseModel, ByteSize, parse_obj_as
17+
from pydantic import AnyUrl, BaseModel, ByteSize, TypeAdapter
1818
from servicelib.aiohttp.client_session import get_client_session
1919
from servicelib.aiohttp.requests_validation import (
2020
parse_request_body_as,
@@ -74,7 +74,7 @@ def _from_storage_url(request: web.Request, storage_url: AnyUrl) -> AnyUrl:
7474
f"/v0/storage{storage_url.path.removeprefix(prefix)}", encoded=True
7575
).with_scheme(request.headers.get(X_FORWARDED_PROTO, request.url.scheme))
7676

77-
webserver_url: AnyUrl = parse_obj_as(AnyUrl, f"{converted_url}")
77+
webserver_url: AnyUrl = TypeAdapter(AnyUrl).validate_python(f"{converted_url}")
7878
return webserver_url
7979

8080

0 commit comments

Comments
 (0)