diff --git a/services/datcore-adapter/requirements/_base.in b/services/datcore-adapter/requirements/_base.in index bcedb3cc8edf..791d139123ad 100644 --- a/services/datcore-adapter/requirements/_base.in +++ b/services/datcore-adapter/requirements/_base.in @@ -18,6 +18,6 @@ aiofiles fastapi fastapi-pagination httpx[http2] -pydantic[email] +pydantic python-multipart # for fastapi multipart uploads uvicorn[standard] diff --git a/services/datcore-adapter/requirements/_base.txt b/services/datcore-adapter/requirements/_base.txt index 9cb77e4a359d..b572351f2e2f 100644 --- a/services/datcore-adapter/requirements/_base.txt +++ b/services/datcore-adapter/requirements/_base.txt @@ -14,10 +14,16 @@ aiofiles==23.2.1 # -r requirements/_base.in aiohttp==3.9.3 # via + # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../requirements/constraints.txt # aiodocker @@ -25,6 +31,8 @@ aiormq==6.8.0 # via aio-pika aiosignal==1.3.1 # via aiohttp +annotated-types==0.7.0 + # via pydantic anyio==4.3.0 # via # fast-depends @@ -52,10 +60,16 @@ botocore==1.34.75 # s3transfer certifi==2024.2.2 # via + # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../requirements/constraints.txt # httpcore @@ -79,19 +93,12 @@ email-validator==2.1.1 # via pydantic fast-depends==2.4.12 # via faststream -fastapi==0.99.1 +fastapi==0.115.3 # via - # -c requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt - # -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt - # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt - # -c requirements/../../../packages/service-library/requirements/../../../requirements/constraints.txt - # -c requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt - # -c requirements/../../../requirements/constraints.txt # -r requirements/../../../packages/service-library/requirements/_fastapi.in # -r requirements/_base.in - # fastapi-pagination # prometheus-fastapi-instrumentator -fastapi-pagination==0.12.21 +fastapi-pagination==0.12.31 # via -r requirements/_base.in faststream==0.5.10 # via -r requirements/../../../packages/service-library/requirements/_base.in @@ -119,10 +126,16 @@ httptools==0.6.1 # via uvicorn httpx==0.27.0 # via + # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../requirements/constraints.txt # -r requirements/../../../packages/service-library/requirements/_fastapi.in @@ -211,10 +224,16 @@ opentelemetry-util-http==0.47b0 # opentelemetry-instrumentation-requests orjson==3.10.0 # via + # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../requirements/constraints.txt # -r requirements/../../../packages/models-library/requirements/_base.in @@ -233,24 +252,49 @@ protobuf==4.25.4 # opentelemetry-proto psutil==6.0.0 # via -r requirements/../../../packages/service-library/requirements/_base.in -pydantic==1.10.14 +pydantic==2.9.2 # via + # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt - # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/_base.in # -c requirements/../../../packages/service-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../requirements/constraints.txt + # -r requirements/../../../packages/common-library/requirements/_base.in + # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/_base.in + # -r requirements/../../../packages/service-library/requirements/../../../packages/common-library/requirements/_base.in + # -r requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/_base.in + # -r requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/_base.in # -r requirements/../../../packages/service-library/requirements/_base.in + # -r requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/settings-library/requirements/_base.in # -r requirements/_base.in # fast-depends # fastapi # fastapi-pagination + # pydantic-extra-types + # pydantic-settings +pydantic-core==2.23.4 + # via pydantic +pydantic-extra-types==2.9.0 + # via + # -r requirements/../../../packages/models-library/requirements/_base.in + # -r requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/_base.in +pydantic-settings==2.6.0 + # via + # -r requirements/../../../packages/models-library/requirements/_base.in + # -r requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/_base.in + # -r requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/_base.in + # -r requirements/../../../packages/settings-library/requirements/_base.in pygments==2.17.2 # via rich pyinstrument==4.6.2 @@ -260,25 +304,39 @@ python-dateutil==2.9.0.post0 # arrow # botocore python-dotenv==1.0.1 - # via uvicorn + # via + # pydantic-settings + # uvicorn python-multipart==0.0.9 # via -r requirements/_base.in pyyaml==6.0.1 # via + # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../requirements/constraints.txt # -r requirements/../../../packages/service-library/requirements/_base.in # uvicorn redis==5.0.4 # via + # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../requirements/constraints.txt # -r requirements/../../../packages/service-library/requirements/_base.in @@ -312,12 +370,18 @@ sniffio==1.3.1 # via # anyio # httpx -starlette==0.27.0 +starlette==0.41.0 # via + # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../requirements/constraints.txt # fastapi @@ -343,13 +407,20 @@ typing-extensions==4.10.0 # faststream # opentelemetry-sdk # pydantic + # pydantic-core # typer urllib3==2.2.1 # via + # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/service-library/requirements/../../../requirements/constraints.txt + # -c requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../requirements/constraints.txt # botocore diff --git a/services/datcore-adapter/src/simcore_service_datcore_adapter/_meta.py b/services/datcore-adapter/src/simcore_service_datcore_adapter/_meta.py index 673b3bec726e..db004a8a9d3b 100644 --- a/services/datcore-adapter/src/simcore_service_datcore_adapter/_meta.py +++ b/services/datcore-adapter/src/simcore_service_datcore_adapter/_meta.py @@ -6,12 +6,12 @@ from typing import Final from models_library.basic_types import VersionStr -from pydantic import parse_obj_as +from pydantic import TypeAdapter current_distribution = distribution("simcore_service_datcore_adapter") __version__ = version("simcore_service_datcore_adapter") -API_VERSION: Final[VersionStr] = parse_obj_as(VersionStr, __version__) +API_VERSION: Final[VersionStr] = TypeAdapter(VersionStr).validate_python(__version__) MAJOR, MINOR, PATCH = __version__.split(".") API_VTAG: Final[str] = f"v{MAJOR}" APP_NAME: Final[str] = current_distribution.metadata["Name"] diff --git a/services/datcore-adapter/src/simcore_service_datcore_adapter/api/errors/http_error.py b/services/datcore-adapter/src/simcore_service_datcore_adapter/api/errors/http_error.py index 6b8dcd0796e6..bcf8cdec9c65 100644 --- a/services/datcore-adapter/src/simcore_service_datcore_adapter/api/errors/http_error.py +++ b/services/datcore-adapter/src/simcore_service_datcore_adapter/api/errors/http_error.py @@ -1,4 +1,4 @@ -from typing import Callable, Optional +from typing import Callable from fastapi import HTTPException from fastapi.encoders import jsonable_encoder @@ -6,7 +6,8 @@ from starlette.responses import JSONResponse -async def http_error_handler(_: Request, exc: HTTPException) -> JSONResponse: +async def http_error_handler(_: Request, exc: Exception) -> JSONResponse: + assert isinstance(exc, HTTPException) # nosec return JSONResponse( content=jsonable_encoder({"errors": [exc.detail]}), status_code=exc.status_code ) @@ -16,7 +17,7 @@ def make_http_error_handler_for_exception( status_code: int, exception_cls: type[BaseException], *, - override_detail_message: Optional[str] = None, + override_detail_message: str | None = None, ) -> Callable: """ Produces a handler for BaseException-type exceptions which converts them diff --git a/services/datcore-adapter/src/simcore_service_datcore_adapter/api/errors/pennsieve_error.py b/services/datcore-adapter/src/simcore_service_datcore_adapter/api/errors/pennsieve_error.py index 79c16ebaa63d..c1101961b34a 100644 --- a/services/datcore-adapter/src/simcore_service_datcore_adapter/api/errors/pennsieve_error.py +++ b/services/datcore-adapter/src/simcore_service_datcore_adapter/api/errors/pennsieve_error.py @@ -7,8 +7,11 @@ async def botocore_exceptions_handler( _: Request, - exc: ClientError, + exc: Exception, ) -> JSONResponse: + assert isinstance(exc, ClientError) # nosec + assert "Error" in exc.response # nosec + assert "Code" in exc.response["Error"] # nosec if exc.response["Error"]["Code"] == "NotAuthorizedException": return JSONResponse( content=jsonable_encoder({"errors": exc.response["Error"]}), diff --git a/services/datcore-adapter/src/simcore_service_datcore_adapter/api/errors/validation_error.py b/services/datcore-adapter/src/simcore_service_datcore_adapter/api/errors/validation_error.py index fb70f6791ac9..3770d62cb23d 100644 --- a/services/datcore-adapter/src/simcore_service_datcore_adapter/api/errors/validation_error.py +++ b/services/datcore-adapter/src/simcore_service_datcore_adapter/api/errors/validation_error.py @@ -1,5 +1,3 @@ -from typing import Union - from fastapi.encoders import jsonable_encoder from fastapi.exceptions import RequestValidationError from fastapi.openapi.constants import REF_PREFIX @@ -12,8 +10,9 @@ async def http422_error_handler( _: Request, - exc: Union[RequestValidationError, ValidationError], + exc: Exception, ) -> JSONResponse: + assert isinstance(exc, RequestValidationError | ValidationError) # nosec return JSONResponse( content=jsonable_encoder({"errors": exc.errors()}), status_code=HTTP_422_UNPROCESSABLE_ENTITY, diff --git a/services/datcore-adapter/src/simcore_service_datcore_adapter/api/routes/files.py b/services/datcore-adapter/src/simcore_service_datcore_adapter/api/routes/files.py index 44fdfb965991..2234c17d3dc1 100644 --- a/services/datcore-adapter/src/simcore_service_datcore_adapter/api/routes/files.py +++ b/services/datcore-adapter/src/simcore_service_datcore_adapter/api/routes/files.py @@ -2,7 +2,7 @@ from typing import Annotated, Any from fastapi import APIRouter, Depends, Header, Request -from pydantic import AnyUrl, parse_obj_as +from pydantic import AnyUrl, TypeAdapter from servicelib.fastapi.requests_decorators import cancel_on_disconnect from starlette import status @@ -34,7 +34,9 @@ async def download_file( api_secret=x_datcore_api_secret, package_id=file_id, ) - return FileDownloadOut(link=parse_obj_as(AnyUrl, f"{presigned_download_link}")) + return FileDownloadOut( + link=TypeAdapter(AnyUrl).validate_python(f"{presigned_download_link}") + ) @router.delete( diff --git a/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py b/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py index 8c4fb44e8e91..7d308fbd3b1a 100644 --- a/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py +++ b/services/datcore-adapter/src/simcore_service_datcore_adapter/core/application.py @@ -50,7 +50,7 @@ def create_app(settings: ApplicationSettings | None = None) -> FastAPI: for name in NOISY_LOGGERS: logging.getLogger(name).setLevel(quiet_level) - logger.debug("App settings:\n%s", settings.json(indent=2)) + logger.debug("App settings:\n%s", settings.model_dump_json(indent=2)) app = FastAPI( debug=settings.debug, diff --git a/services/datcore-adapter/src/simcore_service_datcore_adapter/core/settings.py b/services/datcore-adapter/src/simcore_service_datcore_adapter/core/settings.py index 68e879807abd..784ee5bc7938 100644 --- a/services/datcore-adapter/src/simcore_service_datcore_adapter/core/settings.py +++ b/services/datcore-adapter/src/simcore_service_datcore_adapter/core/settings.py @@ -1,7 +1,7 @@ from functools import cached_property from models_library.basic_types import BootModeEnum, LogLevel -from pydantic import Field, parse_obj_as, validator +from pydantic import AliasChoices, Field, TypeAdapter, field_validator from pydantic.networks import AnyUrl from settings_library.base import BaseCustomSettings from settings_library.tracing import TracingSettings @@ -11,7 +11,9 @@ class PennsieveSettings(BaseCustomSettings): PENNSIEVE_ENABLED: bool = True - PENNSIEVE_API_URL: AnyUrl = parse_obj_as(AnyUrl, "https://api.pennsieve.io") + PENNSIEVE_API_URL: AnyUrl = TypeAdapter(AnyUrl).validate_python( + "https://api.pennsieve.io" + ) PENNSIEVE_API_GENERAL_TIMEOUT: float = 20.0 PENNSIEVE_HEALTCHCHECK_TIMEOUT: float = 1.0 @@ -21,28 +23,31 @@ class ApplicationSettings(BaseCustomSettings, MixinLoggingSettings): SC_BOOT_MODE: BootModeEnum | None LOG_LEVEL: LogLevel = Field( - LogLevel.INFO.value, - env=[ + default=LogLevel.INFO.value, + validation_alias=AliasChoices( "DATCORE_ADAPTER_LOGLEVEL", "DATCORE_ADAPTER_LOG_LEVEL", "LOG_LEVEL", "LOGLEVEL", - ], + ), ) - PENNSIEVE: PennsieveSettings = Field(auto_default_from_env=True) + PENNSIEVE: PennsieveSettings = Field( + json_schema_extra={"auto_default_from_env": True} + ) DATCORE_ADAPTER_LOG_FORMAT_LOCAL_DEV_ENABLED: bool = Field( - False, - env=[ + default=False, + validation_alias=AliasChoices( "DATCORE_ADAPTER_LOG_FORMAT_LOCAL_DEV_ENABLED", "LOG_FORMAT_LOCAL_DEV_ENABLED", - ], + ), description="Enables local development log format. WARNING: make sure it is disabled if you want to have structured logs!", ) DATCORE_ADAPTER_PROMETHEUS_INSTRUMENTATION_ENABLED: bool = True DATCORE_ADAPTER_TRACING: TracingSettings | None = Field( - auto_default_from_env=True, description="settings for opentelemetry tracing" + description="settings for opentelemetry tracing", + json_schema_extra={"auto_default_from_env": True}, ) @cached_property @@ -54,7 +59,7 @@ def debug(self) -> bool: BootModeEnum.LOCAL, ] - @validator("LOG_LEVEL", pre=True) + @field_validator("LOG_LEVEL", mode="before") @classmethod - def _validate_loglevel(cls, value) -> str: + def _validate_loglevel(cls, value: str) -> str: return cls.validate_log_level(value) diff --git a/services/datcore-adapter/src/simcore_service_datcore_adapter/models/schemas/datasets.py b/services/datcore-adapter/src/simcore_service_datcore_adapter/models/schemas/datasets.py index 4d5190c5512c..5a10a88dfcb1 100644 --- a/services/datcore-adapter/src/simcore_service_datcore_adapter/models/schemas/datasets.py +++ b/services/datcore-adapter/src/simcore_service_datcore_adapter/models/schemas/datasets.py @@ -45,14 +45,16 @@ def from_pennsieve_package( return cls( dataset_id=package["content"]["datasetNodeId"], package_id=package["content"]["nodeId"], - id=package["content"]["id"], + id=f"{package['content']['id']}", name=pck_name, path=base_path / pck_name, type=package["content"]["packageType"], size=file_size, created_at=package["content"]["createdAt"], last_modified_at=package["content"]["updatedAt"], - data_type=DataType.FOLDER - if package["content"]["packageType"] == "Collection" - else DataType.FILE, + data_type=( + DataType.FOLDER + if package["content"]["packageType"] == "Collection" + else DataType.FILE + ), ) diff --git a/services/datcore-adapter/tests/unit/conftest.py b/services/datcore-adapter/tests/unit/conftest.py index e4fa08204f5c..0130fda027a5 100644 --- a/services/datcore-adapter/tests/unit/conftest.py +++ b/services/datcore-adapter/tests/unit/conftest.py @@ -3,8 +3,9 @@ # pylint:disable=redefined-outer-name import json +from collections.abc import AsyncIterator, Callable from pathlib import Path -from typing import Any, AsyncIterator, Callable +from typing import Any from uuid import uuid4 import faker @@ -14,7 +15,9 @@ import simcore_service_datcore_adapter from asgi_lifespan import LifespanManager from fastapi.applications import FastAPI +from models_library.basic_types import BootModeEnum from pytest_mock import MockFixture +from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict from simcore_service_datcore_adapter.modules.pennsieve import ( PennsieveAuthorizationHeaders, ) @@ -61,7 +64,9 @@ def pennsieve_mock_dataset_packages(mocks_dir: Path) -> dict[str, Any]: @pytest.fixture() -def minimal_app() -> FastAPI: +def minimal_app( + app_envs: None, +) -> FastAPI: from simcore_service_datcore_adapter.main import the_app return the_app @@ -76,7 +81,7 @@ def client(minimal_app: FastAPI) -> TestClient: @pytest.fixture def app_envs(monkeypatch: pytest.MonkeyPatch): # disable tracing as together with LifespanManager, it does not remove itself nicely - ... + return setenvs_from_dict(monkeypatch, {"SC_BOOT_MODE": BootModeEnum.DEBUG}) @pytest.fixture() @@ -87,7 +92,7 @@ async def initialized_app( yield minimal_app -@pytest.fixture(scope="function") +@pytest.fixture async def async_client(initialized_app: FastAPI) -> AsyncIterator[httpx.AsyncClient]: async with httpx.AsyncClient( app=initialized_app, @@ -215,14 +220,13 @@ def pennsieve_api_headers( def pennsieve_random_fake_datasets( create_pennsieve_fake_dataset_id: Callable, ) -> dict[str, Any]: - datasets = { + return { "datasets": [ {"content": {"id": create_pennsieve_fake_dataset_id(), "name": fake.text()}} for _ in range(10) ], "totalCount": 20, } - return datasets @pytest.fixture diff --git a/services/datcore-adapter/tests/unit/test_route_datasets.py b/services/datcore-adapter/tests/unit/test_route_datasets.py index 2c9c98b20f40..2a0d7dc85d6f 100644 --- a/services/datcore-adapter/tests/unit/test_route_datasets.py +++ b/services/datcore-adapter/tests/unit/test_route_datasets.py @@ -3,12 +3,10 @@ # pylint:disable=redefined-outer-name -from typing import Optional - import httpx import respx from fastapi_pagination import Page -from pydantic import parse_obj_as +from pydantic import TypeAdapter from simcore_service_datcore_adapter.models.schemas.datasets import ( DatasetMetaData, FileMetaData, @@ -18,7 +16,7 @@ async def test_list_datasets_entrypoint( async_client: httpx.AsyncClient, - pennsieve_subsystem_mock: Optional[respx.MockRouter], + pennsieve_subsystem_mock: respx.MockRouter | None, pennsieve_api_headers: dict[str, str], ): response = await async_client.get( @@ -29,7 +27,7 @@ async def test_list_datasets_entrypoint( assert response.status_code == status.HTTP_200_OK data = response.json() assert data - parse_obj_as(Page[DatasetMetaData], data) + TypeAdapter(Page[DatasetMetaData]).validate_python(data) async def test_list_dataset_files_legacy_entrypoint( @@ -47,7 +45,7 @@ async def test_list_dataset_files_legacy_entrypoint( assert response.status_code == status.HTTP_200_OK data = response.json() assert data - parse_obj_as(list[FileMetaData], data) + TypeAdapter(list[FileMetaData]).validate_python(data) async def test_list_dataset_top_level_files_entrypoint( @@ -65,7 +63,7 @@ async def test_list_dataset_top_level_files_entrypoint( assert response.status_code == status.HTTP_200_OK data = response.json() assert data - parse_obj_as(Page[FileMetaData], data) + TypeAdapter(Page[FileMetaData]).validate_python(data) async def test_list_dataset_collection_files_entrypoint( @@ -85,4 +83,4 @@ async def test_list_dataset_collection_files_entrypoint( assert response.status_code == status.HTTP_200_OK data = response.json() assert data - parse_obj_as(Page[FileMetaData], data) + TypeAdapter(Page[FileMetaData]).validate_python(data) diff --git a/services/datcore-adapter/tests/unit/test_route_files.py b/services/datcore-adapter/tests/unit/test_route_files.py index 840a7edf79f7..cbaa09704faf 100644 --- a/services/datcore-adapter/tests/unit/test_route_files.py +++ b/services/datcore-adapter/tests/unit/test_route_files.py @@ -5,7 +5,7 @@ from unittest.mock import Mock import httpx -from pydantic import parse_obj_as +from pydantic import TypeAdapter from simcore_service_datcore_adapter.models.domains.files import FileDownloadOut from starlette import status @@ -23,7 +23,7 @@ async def test_download_file_entrypoint( assert response.status_code == status.HTTP_200_OK data = response.json() assert data - parse_obj_as(FileDownloadOut, data) + TypeAdapter(FileDownloadOut).validate_python(data) async def test_delete_file_entrypoint( diff --git a/services/datcore-adapter/tests/unit/test_route_health.py b/services/datcore-adapter/tests/unit/test_route_health.py index 7ab697612c41..3f0b1712f7ea 100644 --- a/services/datcore-adapter/tests/unit/test_route_health.py +++ b/services/datcore-adapter/tests/unit/test_route_health.py @@ -31,7 +31,7 @@ async def test_check_subsystem_health(async_client: httpx.AsyncClient): assert pennsieve_health_route.called assert response.status_code == status.HTTP_200_OK - app_status = AppStatusCheck.parse_obj(response.json()) + app_status = AppStatusCheck.model_validate(response.json()) assert app_status assert app_status.app_name == "simcore-service-datcore-adapter" assert app_status.services == {"pennsieve": True} @@ -43,7 +43,7 @@ async def test_check_subsystem_health(async_client: httpx.AsyncClient): assert pennsieve_health_route.called assert response.status_code == status.HTTP_200_OK - app_status = AppStatusCheck.parse_obj(response.json()) + app_status = AppStatusCheck.model_validate(response.json()) assert app_status assert app_status.app_name == "simcore-service-datcore-adapter" assert app_status.services == {"pennsieve": False}