diff --git a/api/tests/requirements.txt b/api/tests/requirements.txt index c4c2337ad6d..cb1405f4c0e 100644 --- a/api/tests/requirements.txt +++ b/api/tests/requirements.txt @@ -1,6 +1,6 @@ aiohappyeyeballs==2.6.1 # via aiohttp -aiohttp==3.12.13 +aiohttp==3.12.14 # via # -c ../../requirements/constraints.txt # -r requirements.in @@ -11,7 +11,7 @@ attrs==25.3.0 # aiohttp # jsonschema # referencing -certifi==2025.6.15 +certifi==2025.7.9 # via # -c ../../requirements/constraints.txt # requests diff --git a/ci/helpers/requirements/requirements.txt b/ci/helpers/requirements/requirements.txt index d278e1f092a..6d023c4a3ec 100644 --- a/ci/helpers/requirements/requirements.txt +++ b/ci/helpers/requirements/requirements.txt @@ -39,11 +39,11 @@ propcache==0.3.1 # via # aiohttp # yarl -pydantic==2.10.5 +pydantic==2.11.7 # via # -c requirements/../../../requirements/constraints.txt # fastapi -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic requests==2.32.4 # via docker @@ -58,6 +58,9 @@ typing-extensions==4.14.1 # fastapi # pydantic # pydantic-core + # typing-inspection +typing-inspection==0.4.1 + # via pydantic urllib3==2.5.0 # via # -c requirements/../../../requirements/constraints.txt diff --git a/packages/aws-library/requirements/_base.txt b/packages/aws-library/requirements/_base.txt index afa763b240a..9b99e72ea68 100644 --- a/packages/aws-library/requirements/_base.txt +++ b/packages/aws-library/requirements/_base.txt @@ -238,7 +238,7 @@ psutil==7.0.0 # via -r requirements/../../../packages/service-library/requirements/_base.in pycryptodome==3.21.0 # via stream-zip -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -267,9 +267,9 @@ pydantic==2.10.6 # fast-depends # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.2 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in @@ -417,6 +417,9 @@ typing-extensions==4.14.1 # types-aiobotocore-ec2 # types-aiobotocore-s3 # types-aiobotocore-ssm + # typing-inspection +typing-inspection==0.4.1 + # via pydantic urllib3==2.5.0 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt diff --git a/packages/aws-library/requirements/_test.txt b/packages/aws-library/requirements/_test.txt index 7a6699a1908..82d16dbfd3b 100644 --- a/packages/aws-library/requirements/_test.txt +++ b/packages/aws-library/requirements/_test.txt @@ -176,13 +176,13 @@ py-partiql-parser==0.6.1 # via moto pycparser==2.22 # via cffi -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../requirements/constraints.txt # -c requirements/_base.txt # aws-sam-translator # fastapi -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via # -c requirements/_base.txt # pydantic @@ -315,6 +315,11 @@ typing-extensions==4.14.1 # types-aioboto3 # types-aiobotocore # types-boto3 + # typing-inspection +typing-inspection==0.4.1 + # via + # -c requirements/_base.txt + # pydantic tzdata==2025.1 # via faker urllib3==2.5.0 diff --git a/packages/celery-library/requirements/_base.txt b/packages/celery-library/requirements/_base.txt index 34fd054f044..12dfb71bb43 100644 --- a/packages/celery-library/requirements/_base.txt +++ b/packages/celery-library/requirements/_base.txt @@ -224,7 +224,7 @@ psutil==7.0.0 # via -r requirements/../../../packages/service-library/requirements/_base.in pycryptodome==3.23.0 # via stream-zip -pydantic==2.11.4 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -254,7 +254,7 @@ pydantic==2.11.4 # pydantic-settings pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.4 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in diff --git a/packages/common-library/requirements/_base.txt b/packages/common-library/requirements/_base.txt index e315465ad75..819cfba5b25 100644 --- a/packages/common-library/requirements/_base.txt +++ b/packages/common-library/requirements/_base.txt @@ -4,17 +4,20 @@ orjson==3.10.15 # via # -c requirements/../../../requirements/constraints.txt # -r requirements/_base.in -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../requirements/constraints.txt # -r requirements/_base.in # pydantic-extra-types -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.2 +pydantic-extra-types==2.10.5 # via -r requirements/_base.in typing-extensions==4.14.1 # via # pydantic # pydantic-core # pydantic-extra-types + # typing-inspection +typing-inspection==0.4.1 + # via pydantic diff --git a/packages/common-library/requirements/_test.txt b/packages/common-library/requirements/_test.txt index 6a3dd06319e..5a64e5150c1 100644 --- a/packages/common-library/requirements/_test.txt +++ b/packages/common-library/requirements/_test.txt @@ -22,12 +22,12 @@ pluggy==1.5.0 # pytest-cov pprintpp==0.4.0 # via pytest-icdiff -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../requirements/constraints.txt # -c requirements/_base.txt # pydantic-settings -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via # -c requirements/_base.txt # pydantic @@ -71,5 +71,10 @@ typing-extensions==4.14.1 # -c requirements/_base.txt # pydantic # pydantic-core + # typing-inspection +typing-inspection==0.4.1 + # via + # -c requirements/_base.txt + # pydantic tzdata==2025.1 # via faker diff --git a/packages/common-library/src/common_library/serialization.py b/packages/common-library/src/common_library/serialization.py index 70dd53e13c4..a24f0e7e96e 100644 --- a/packages/common-library/src/common_library/serialization.py +++ b/packages/common-library/src/common_library/serialization.py @@ -11,7 +11,9 @@ def model_dump_with_secrets( ) -> dict[str, Any]: data = settings_obj.model_dump(**pydantic_export_options) - for field_name in settings_obj.model_fields: + settings_cls = settings_obj.__class__ + + for field_name in settings_cls.model_fields: if field_name not in data: continue @@ -29,7 +31,9 @@ def model_dump_with_secrets( data[field_name] = str(field_data) elif isinstance(field_data, dict): - possible_pydantic_model = settings_obj.model_fields[field_name].annotation + possible_pydantic_model = settings_obj.__class__.model_fields[ + field_name + ].annotation # NOTE: data could be a dict which does not represent a pydantic model or a union of models with contextlib.suppress(AttributeError, ValidationError): data[field_name] = model_dump_with_secrets( diff --git a/packages/dask-task-models-library/requirements/_base.txt b/packages/dask-task-models-library/requirements/_base.txt index 59717a96cdc..1a835b013fa 100644 --- a/packages/dask-task-models-library/requirements/_base.txt +++ b/packages/dask-task-models-library/requirements/_base.txt @@ -76,7 +76,7 @@ partd==1.4.2 # via dask psutil==7.0.0 # via distributed -pydantic==2.11.4 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -94,7 +94,7 @@ pydantic==2.11.4 # pydantic-settings pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.4 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in diff --git a/packages/models-library/requirements/_base.txt b/packages/models-library/requirements/_base.txt index d680cfc7b08..74c283766c8 100644 --- a/packages/models-library/requirements/_base.txt +++ b/packages/models-library/requirements/_base.txt @@ -22,7 +22,7 @@ orjson==3.10.15 # -c requirements/../../../requirements/constraints.txt # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/_base.in -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../requirements/constraints.txt @@ -30,9 +30,9 @@ pydantic==2.10.6 # -r requirements/_base.in # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.2 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/_base.in @@ -64,3 +64,6 @@ typing-extensions==4.14.1 # pydantic # pydantic-core # pydantic-extra-types + # typing-inspection +typing-inspection==0.4.1 + # via pydantic diff --git a/packages/models-library/src/models_library/api_schemas_webserver/_base.py b/packages/models-library/src/models_library/api_schemas_webserver/_base.py index 4dfcf1473dd..44ae40ddc51 100644 --- a/packages/models-library/src/models_library/api_schemas_webserver/_base.py +++ b/packages/models-library/src/models_library/api_schemas_webserver/_base.py @@ -1,5 +1,5 @@ """ - Base model classes for schemas in OpenAPI specs (OAS) for this service +Base model classes for schemas in OpenAPI specs (OAS) for this service """ @@ -29,9 +29,8 @@ class InputSchemaWithoutCamelCase(BaseModel): ) -class InputSchema(BaseModel): +class InputSchema(InputSchemaWithoutCamelCase): model_config = ConfigDict( - **InputSchemaWithoutCamelCase.model_config, alias_generator=snake_to_camel, ) diff --git a/packages/models-library/src/models_library/service_settings_labels.py b/packages/models-library/src/models_library/service_settings_labels.py index b3e1956caba..9cbfb64b00b 100644 --- a/packages/models-library/src/models_library/service_settings_labels.py +++ b/packages/models-library/src/models_library/service_settings_labels.py @@ -570,8 +570,9 @@ def _not_allowed_in_both_specs(self): "containers_allowed_outgoing_internet", "containers_allowed_outgoing_permit_list", } - if match_keys & set(self.model_fields) != match_keys: - err_msg = f"Expected the following keys {match_keys} to be present {self.model_fields=}" + cls = self.__class__ + if match_keys & set(cls.model_fields) != match_keys: + err_msg = f"Expected the following keys {match_keys} to be present {cls.model_fields=}" raise ValueError(err_msg) if ( diff --git a/packages/models-library/tests/test__pydantic_models.py b/packages/models-library/tests/test__pydantic_models.py index 1d9dc14e3b4..4e2aa2f4a23 100644 --- a/packages/models-library/tests/test__pydantic_models.py +++ b/packages/models-library/tests/test__pydantic_models.py @@ -1,4 +1,4 @@ -""" This test suite does not intend to re-test pydantic but rather +"""This test suite does not intend to re-test pydantic but rather check some "corner cases" or critical setups with pydantic model such that: - we can ensure a given behaviour is preserved through updates @@ -6,13 +6,14 @@ """ -from typing import Any, Union, get_args, get_origin +from typing import Any, Literal, Union, get_args, get_origin import pytest from common_library.json_serialization import json_dumps from models_library.projects_nodes import InputTypes, OutputTypes from models_library.projects_nodes_io import SimCoreFileLink -from pydantic import BaseModel, Field, TypeAdapter, ValidationError +from models_library.utils.change_case import snake_to_camel +from pydantic import BaseModel, ConfigDict, Field, TypeAdapter, ValidationError from pydantic.types import Json from pydantic.version import version_short @@ -120,7 +121,7 @@ class Func(BaseModel): {"$ref": "#/$defs/DatCoreFileLink"}, {"$ref": "#/$defs/DownloadLink"}, {"type": "array", "items": {}}, - {"type": "object"}, + {"type": "object", "additionalProperties": True}, ], } @@ -154,7 +155,7 @@ class Func(BaseModel): MINIMAL = 2 # <--- index of the example with the minimum required fields assert SimCoreFileLink in get_args(OutputTypes) example = SimCoreFileLink.model_validate( - SimCoreFileLink.model_config["json_schema_extra"]["examples"][MINIMAL] + SimCoreFileLink.model_json_schema()["examples"][MINIMAL] ) model = Func.model_validate( { @@ -183,7 +184,9 @@ def test_nullable_fields_from_pydantic_v1(): # SEE https://github.com/ITISFoundation/osparc-simcore/pull/6751 class MyModel(BaseModel): # pydanticv1 would add a default to fields set as nullable - nullable_required: str | None # <--- This was default to =None in pydantic 1 !!! + nullable_required: ( + str | None + ) # <--- This was default to =None in pydantic 1 !!! nullable_required_with_hyphen: str | None = Field(default=...) nullable_optional: str | None = None @@ -209,3 +212,112 @@ class MyModel(BaseModel): data["nullable_required"] = None model = MyModel.model_validate(data) assert model.model_dump(exclude_unset=True) == data + + +# BELOW some tests related to deprecated `populate_by_name` in pydantic v2.11+ !! +# +# https://docs.pydantic.dev/latest/api/config/#pydantic.config.ConfigDict.populate_by_name +# +# `populate_by_name` usage is not recommended in v2.11+ and will be deprecated in v3. Instead, you should use the validate_by_name configuration setting. +# When validate_by_name=True and validate_by_alias=True, this is strictly equivalent to the previous behavior of populate_by_name=True. +# In v2.11, we also introduced a validate_by_alias setting that introduces more fine grained control for validation behavior. +# Here's how you might go about using the new settings to achieve the same behavior: +# + + +@pytest.mark.parametrize("extra", ["ignore", "allow", "forbid"]) +@pytest.mark.parametrize( + "validate_by_alias, validate_by_name", + [ + # NOTE: (False, False) is not allowed: at least one has to be True! + # SEE https://docs.pydantic.dev/latest/api/config/#pydantic.config.ConfigDict.validate_by_alias + (False, True), + (True, False), + (True, True), + ], +) +def test_model_config_validate_by_alias_and_name( + validate_by_alias: bool, + validate_by_name: bool, + extra: Literal["ignore", "allow", "forbid"], +): + class TestModel(BaseModel): + snake_case: str | None = None + + model_config = ConfigDict( + validate_by_alias=validate_by_alias, + validate_by_name=validate_by_name, + extra=extra, + alias_generator=snake_to_camel, + ) + + assert TestModel.model_config.get("populate_by_name") is None + assert TestModel.model_config.get("validate_by_alias") is validate_by_alias + assert TestModel.model_config.get("validate_by_name") is validate_by_name + assert TestModel.model_config.get("extra") == extra + + if validate_by_alias is False: + + if extra == "forbid": + with pytest.raises(ValidationError): + TestModel.model_validate({"snakeCase": "foo"}) + + elif extra == "ignore": + model = TestModel.model_validate({"snakeCase": "foo"}) + assert model.snake_case is None + assert model.model_dump() == {"snake_case": None} + + elif extra == "allow": + model = TestModel.model_validate({"snakeCase": "foo"}) + assert model.snake_case is None + assert model.model_dump() == {"snake_case": None, "snakeCase": "foo"} + + else: + assert TestModel.model_validate({"snakeCase": "foo"}).snake_case == "foo" + + if validate_by_name is False: + if extra == "forbid": + with pytest.raises(ValidationError): + TestModel.model_validate({"snake_case": "foo"}) + + elif extra == "ignore": + model = TestModel.model_validate({"snake_case": "foo"}) + assert model.snake_case is None + assert model.model_dump() == {"snake_case": None} + + elif extra == "allow": + model = TestModel.model_validate({"snake_case": "foo"}) + assert model.snake_case is None + assert model.model_dump() == {"snake_case": "foo"} + else: + assert TestModel.model_validate({"snake_case": "foo"}).snake_case == "foo" + + +@pytest.mark.parametrize("populate_by_name", [True, False]) +def test_model_config_populate_by_name(populate_by_name: bool): + # SEE https://docs.pydantic.dev/latest/api/config/#pydantic.config.ConfigDict.populate_by_name + class TestModel(BaseModel): + snake_case: str | None = None + + model_config = ConfigDict( + populate_by_name=populate_by_name, + extra="forbid", # easier to check the effect of populate_by_name! + alias_generator=snake_to_camel, + ) + + # checks how they are set + assert TestModel.model_config.get("populate_by_name") is populate_by_name + assert TestModel.model_config.get("extra") == "forbid" + + # NOTE how defaults work with populate_by_name!! + assert TestModel.model_config.get("validate_by_name") == populate_by_name + assert TestModel.model_config.get("validate_by_alias") is True # Default + + # validate_by_alias BEHAVIUOR defaults to True + TestModel.model_validate({"snakeCase": "foo"}) + + if populate_by_name: + assert TestModel.model_validate({"snake_case": "foo"}).snake_case == "foo" + else: + with pytest.raises(ValidationError): + TestModel.model_validate({"snake_case": "foo"}) diff --git a/packages/notifications-library/requirements/_base.txt b/packages/notifications-library/requirements/_base.txt index 867decf6614..7909138f23a 100644 --- a/packages/notifications-library/requirements/_base.txt +++ b/packages/notifications-library/requirements/_base.txt @@ -81,7 +81,7 @@ propcache==0.3.0 # via yarl psycopg2-binary==2.9.10 # via sqlalchemy -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -100,9 +100,9 @@ pydantic==2.10.6 # -r requirements/../../../packages/settings-library/requirements/_base.in # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.2 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in @@ -174,5 +174,8 @@ typing-extensions==4.14.1 # pydantic-core # pydantic-extra-types # typer + # typing-inspection +typing-inspection==0.4.1 + # via pydantic yarl==1.18.3 # via -r requirements/../../../packages/postgres-database/requirements/_base.in diff --git a/packages/postgres-database/requirements/_base.txt b/packages/postgres-database/requirements/_base.txt index 40b17728545..ad96d677f66 100644 --- a/packages/postgres-database/requirements/_base.txt +++ b/packages/postgres-database/requirements/_base.txt @@ -26,16 +26,16 @@ propcache==0.3.0 # via yarl psycopg2-binary==2.9.10 # via sqlalchemy -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../requirements/constraints.txt # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/_base.in # pydantic-extra-types -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.2 +pydantic-extra-types==2.10.5 # via -r requirements/../../../packages/common-library/requirements/_base.in sqlalchemy==1.4.54 # via @@ -49,5 +49,8 @@ typing-extensions==4.14.1 # pydantic # pydantic-core # pydantic-extra-types + # typing-inspection +typing-inspection==0.4.1 + # via pydantic yarl==1.18.3 # via -r requirements/_base.in diff --git a/packages/service-integration/requirements/_base.txt b/packages/service-integration/requirements/_base.txt index a3addd80045..869172883c5 100644 --- a/packages/service-integration/requirements/_base.txt +++ b/packages/service-integration/requirements/_base.txt @@ -81,7 +81,7 @@ pluggy==1.5.0 # via pytest propcache==0.3.0 # via yarl -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -92,9 +92,9 @@ pydantic==2.10.6 # -r requirements/../../../packages/models-library/requirements/_base.in # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.2 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in @@ -162,6 +162,9 @@ typing-extensions==4.14.1 # pydantic-core # pydantic-extra-types # typer + # typing-inspection +typing-inspection==0.4.1 + # via pydantic urllib3==2.5.0 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt diff --git a/packages/service-library/requirements/_base.txt b/packages/service-library/requirements/_base.txt index 37bee6b3088..3a8a3cfe4e3 100644 --- a/packages/service-library/requirements/_base.txt +++ b/packages/service-library/requirements/_base.txt @@ -178,7 +178,7 @@ psutil==7.0.0 # via -r requirements/_base.in pycryptodome==3.21.0 # via stream-zip -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -195,9 +195,9 @@ pydantic==2.10.6 # fast-depends # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.2 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in @@ -291,6 +291,9 @@ typing-extensions==4.14.1 # pydantic-core # pydantic-extra-types # typer + # typing-inspection +typing-inspection==0.4.1 + # via pydantic urllib3==2.5.0 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt diff --git a/packages/service-library/requirements/_fastapi.txt b/packages/service-library/requirements/_fastapi.txt index b236331b4bc..ea13f1a8db8 100644 --- a/packages/service-library/requirements/_fastapi.txt +++ b/packages/service-library/requirements/_fastapi.txt @@ -94,9 +94,9 @@ packaging==24.2 # via opentelemetry-instrumentation prometheus-client==0.21.1 # via -r requirements/_fastapi.in -pydantic==2.10.6 +pydantic==2.11.7 # via fastapi -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic pygments==2.19.1 # via rich @@ -130,6 +130,9 @@ typing-extensions==4.14.1 # pydantic-core # rich-toolkit # typer + # typing-inspection +typing-inspection==0.4.1 + # via pydantic uvicorn==0.34.2 # via # fastapi diff --git a/packages/settings-library/requirements/_base.txt b/packages/settings-library/requirements/_base.txt index e9eca244b52..6b9c10260c5 100644 --- a/packages/settings-library/requirements/_base.txt +++ b/packages/settings-library/requirements/_base.txt @@ -11,7 +11,7 @@ orjson==3.10.15 # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../requirements/constraints.txt # -r requirements/../../../packages/common-library/requirements/_base.in -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../requirements/constraints.txt @@ -19,9 +19,9 @@ pydantic==2.10.6 # -r requirements/_base.in # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.2 +pydantic-extra-types==2.10.5 # via -r requirements/../../../packages/common-library/requirements/_base.in pydantic-settings==2.7.0 # via @@ -46,3 +46,6 @@ typing-extensions==4.14.1 # pydantic-core # pydantic-extra-types # typer + # typing-inspection +typing-inspection==0.4.1 + # via pydantic diff --git a/packages/settings-library/src/settings_library/base.py b/packages/settings-library/src/settings_library/base.py index 9ab3119dfc7..8c5a06488ca 100644 --- a/packages/settings-library/src/settings_library/base.py +++ b/packages/settings-library/src/settings_library/base.py @@ -1,6 +1,6 @@ import logging from functools import cached_property -from typing import Any, Final, get_origin +from typing import Any, Final from common_library.pydantic_fields_extension import get_type, is_literal, is_nullable from pydantic import ValidationInfo, field_validator @@ -15,9 +15,9 @@ _logger = logging.getLogger(__name__) -_AUTO_DEFAULT_FACTORY_RESOLVES_TO_NONE_FSTRING: Final[ - str -] = "{field_name} auto_default_from_env unresolved, defaulting to None" +_AUTO_DEFAULT_FACTORY_RESOLVES_TO_NONE_FSTRING: Final[str] = ( + "{field_name} auto_default_from_env unresolved, defaulting to None" +) class DefaultFromEnvFactoryError(ValueError): @@ -119,11 +119,14 @@ def _parse_none(cls, v, info: ValidationInfo): model_config = SettingsConfigDict( case_sensitive=True, # All must be capitalized - extra="forbid", + env_parse_none_str="null", + extra="ignore", # NOTE: if "strict" then fields with multiple aliases defined in the envs will fail to validate! frozen=True, - validate_default=True, ignored_types=(cached_property,), - env_parse_none_str="null", + populate_by_name=True, # NOTE: populate_by_name deprecated in pydantic v2.11+ + validate_by_alias=True, + validate_by_name=True, + validate_default=True, ) @classmethod @@ -133,28 +136,15 @@ def __pydantic_init_subclass__(cls, **kwargs: Any): for name, field in cls.model_fields.items(): auto_default_from_env = _is_auto_default_from_env_enabled(field) field_type = get_type(field) - - # Avoids issubclass raising TypeError. SEE test_issubclass_type_error_with_pydantic_models - is_not_composed = ( - get_origin(field_type) is None - ) # is not composed as dict[str, Any] or Generic[Base] is_not_literal = not is_literal(field) - if ( - is_not_literal - and is_not_composed - and issubclass(field_type, BaseCustomSettings) - ): + if is_not_literal and issubclass(field_type, BaseCustomSettings): if auto_default_from_env: # Builds a default factory `Field(default_factory=create_settings_from_env(field))` field.default_factory = _create_settings_from_env(name, field) field.default = None - elif ( - is_not_literal - and is_not_composed - and issubclass(field_type, BaseSettings) - ): + elif is_not_literal and issubclass(field_type, BaseSettings): msg = f"{cls}.{name} of type {field_type} must inherit from BaseCustomSettings" raise ValueError(msg) diff --git a/packages/settings-library/src/settings_library/postgres.py b/packages/settings-library/src/settings_library/postgres.py index 83aa960c92c..2a53ef57bce 100644 --- a/packages/settings-library/src/settings_library/postgres.py +++ b/packages/settings-library/src/settings_library/postgres.py @@ -10,6 +10,7 @@ ValidationInfo, field_validator, ) +from pydantic.config import JsonDict from pydantic_settings import SettingsConfigDict from .base import BaseCustomSettings @@ -41,8 +42,8 @@ class PostgresSettings(BaseCustomSettings): Field( description="Name of the application connecting the postgres database, will default to use the host hostname (hostname on linux)", validation_alias=AliasChoices( - "POSTGRES_CLIENT_NAME", # This is useful when running inside a docker container, then the hostname is set each client gets a different name + "POSTGRES_CLIENT_NAME", "HOST", "HOSTNAME", ), @@ -103,17 +104,34 @@ def _update_query(self, uri: str) -> str: return urlunparse(parsed_uri._replace(query=updated_query)) return uri - model_config = SettingsConfigDict( - json_schema_extra={ - "examples": [ - # minimal required - { - "POSTGRES_HOST": "localhost", - "POSTGRES_PORT": "5432", - "POSTGRES_USER": "usr", - "POSTGRES_PASSWORD": "secret", - "POSTGRES_DB": "db", - } - ], - } - ) + @staticmethod + def _update_json_schema_extra(schema: JsonDict) -> None: + schema.update( + { + "examples": [ + # minimal required + { + "POSTGRES_HOST": "localhost", + "POSTGRES_PORT": "5432", + "POSTGRES_USER": "usr", + "POSTGRES_PASSWORD": "secret", + "POSTGRES_DB": "db", + }, + # full example + { + "POSTGRES_HOST": "localhost", + "POSTGRES_PORT": "5432", + "POSTGRES_USER": "usr", + "POSTGRES_PASSWORD": "secret", + "POSTGRES_DB": "db", + "POSTGRES_MINSIZE": 1, + "POSTGRES_MAXSIZE": 50, + "POSTGRES_CLIENT_NAME": "my_app", # first-choice + "HOST": "should be ignored", + "HOST_NAME": "should be ignored", + }, + ], + } + ) + + model_config = SettingsConfigDict(json_schema_extra=_update_json_schema_extra) diff --git a/packages/settings-library/src/settings_library/utils_cli.py b/packages/settings-library/src/settings_library/utils_cli.py index 875e8b22f84..3d180c8be2d 100644 --- a/packages/settings-library/src/settings_library/utils_cli.py +++ b/packages/settings-library/src/settings_library/utils_cli.py @@ -26,8 +26,9 @@ def print_as_envfile( **pydantic_export_options, ): exclude_unset = pydantic_export_options.get("exclude_unset", False) + settings_cls = settings_obj.__class__ - for name, field in type(settings_obj).model_fields.items(): + for name, field in settings_cls.model_fields.items(): auto_default_from_env = ( field.json_schema_extra is not None and field.json_schema_extra.get("auto_default_from_env", False) diff --git a/packages/settings-library/tests/test__models_examples.py b/packages/settings-library/tests/test__models_examples.py index c93ed934cf1..beaaefc8880 100644 --- a/packages/settings-library/tests/test__models_examples.py +++ b/packages/settings-library/tests/test__models_examples.py @@ -2,7 +2,7 @@ import pytest import settings_library -from pydantic import BaseModel +from pydantic_settings import BaseSettings from pytest_simcore.pydantic_models import ( assert_validation_model, walk_model_examples_in_package, @@ -14,9 +14,19 @@ walk_model_examples_in_package(settings_library), ) def test_all_settings_library_models_config_examples( - model_cls: type[BaseModel], example_name: str, example_data: Any + model_cls: type[BaseSettings], example_name: str, example_data: Any ): + assert ( + model_cls.model_config.get("populate_by_name") is True + ), f"populate_by_name must be enabled in {model_cls}. It will be deprecated in the future but for now it is required to use aliases in the settings" + assert ( + model_cls.model_config.get("validate_by_alias") is True + ), f"validate_by_alias must be enabled in {model_cls}" + assert ( + model_cls.model_config.get("validate_by_name") is True + ), f"validate_by_name must be enabled in {model_cls}" + assert_validation_model( model_cls, example_name=example_name, example_data=example_data ) diff --git a/packages/settings-library/tests/test__pydantic_settings.py b/packages/settings-library/tests/test__pydantic_settings.py index eb2989852cb..a2d06c8a3ef 100644 --- a/packages/settings-library/tests/test__pydantic_settings.py +++ b/packages/settings-library/tests/test__pydantic_settings.py @@ -2,7 +2,7 @@ # pylint: disable=unused-argument # pylint: disable=unused-variable -""" Tests subtle details about pydantic models +"""Tests subtle details about pydantic models This test suite intends to "freeze" some concepts/invariants from pydantic upon which we are going to build this libraries. @@ -17,7 +17,12 @@ import pytest from common_library.basic_types import LogLevel from common_library.pydantic_fields_extension import is_nullable -from pydantic import AliasChoices, Field, ValidationInfo, field_validator +from pydantic import ( + AliasChoices, + Field, + ValidationInfo, + field_validator, +) from pydantic_core import PydanticUndefined from pydantic_settings import BaseSettings from pytest_simcore.helpers.monkeypatch_envs import setenvs_from_dict diff --git a/packages/settings-library/tests/test_base.py b/packages/settings-library/tests/test_base.py index 3a94448b510..026abdfc5d6 100644 --- a/packages/settings-library/tests/test_base.py +++ b/packages/settings-library/tests/test_base.py @@ -335,28 +335,34 @@ class SettingsClassExt(SettingsClass): } -def test_issubclass_type_error_with_pydantic_models(): - # There is a problem - # - # TypeError: issubclass() arg 1 must be a class - # - # SEE https://github.com/pydantic/pydantic/issues/545 - # - # >> issubclass(dict, BaseSettings) - # False - # >> issubclass(dict[str, str], BaseSettings) - # Traceback (most recent call last): - # File "", line 1, in - # File "/home/crespo/.pyenv/versions/3.10.13/lib/python3.10/abc.py", line 123, in __subclasscheck__ - # return _abc_subclasscheck(cls, subclass) - # TypeError: issubclass() arg 1 must be a class - # +def test_fixed_issubclass_type_error_with_pydantic_models(): assert not issubclass(dict, BaseSettings) - - # NOTE: this should be fixed by pydantic at some point. When this happens, this test will fail - with pytest.raises(TypeError): - issubclass(dict[str, str], BaseSettings) + assert not issubclass( + # FIXED with + # + # pydantic 2.11.7 + # pydantic_core 2.33.2 + # pydantic-extra-types 2.10.5 + # pydantic-settings 2.7.0 + # + # + # TypeError: issubclass() arg 1 must be a class + # + # SEE https://github.com/pydantic/pydantic/issues/545 + # + # >> issubclass(dict, BaseSettings) + # False + # >> issubclass(dict[str, str], BaseSettings) + # Traceback (most recent call last): + # File "", line 1, in + # File "/home/crespo/.pyenv/versions/3.10.13/lib/python3.10/abc.py", line 123, in __subclasscheck__ + # return _abc_subclasscheck(cls, subclass) + # TypeError: issubclass() arg 1 must be a class + # + dict[str, str], + BaseSettings, + ) # here reproduces the problem with our settings that ANE and PC had class SettingsClassThatFailed(BaseCustomSettings): diff --git a/packages/settings-library/tests/test_base_w_postgres.py b/packages/settings-library/tests/test_base_w_postgres.py index 1597e9edf99..67021222204 100644 --- a/packages/settings-library/tests/test_base_w_postgres.py +++ b/packages/settings-library/tests/test_base_w_postgres.py @@ -62,7 +62,9 @@ class _FakePostgresSettings(BaseCustomSettings): str | None, Field( validation_alias=AliasChoices( - "HOST", "HOSTNAME", "POSTGRES_CLIENT_NAME" + "POSTGRES_CLIENT_NAME", + "HOST", + "HOSTNAME", ), ), ] = None diff --git a/packages/simcore-sdk/requirements/_base.txt b/packages/simcore-sdk/requirements/_base.txt index f29a744121f..82c65e06d1a 100644 --- a/packages/simcore-sdk/requirements/_base.txt +++ b/packages/simcore-sdk/requirements/_base.txt @@ -277,7 +277,7 @@ psycopg2-binary==2.9.10 # via sqlalchemy pycryptodome==3.21.0 # via stream-zip -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -310,9 +310,9 @@ pydantic==2.10.6 # fast-depends # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.2 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in @@ -475,6 +475,9 @@ typing-extensions==4.14.1 # pydantic-core # pydantic-extra-types # typer + # typing-inspection +typing-inspection==0.4.1 + # via pydantic urllib3==2.5.0 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt diff --git a/packages/simcore-sdk/requirements/_test.txt b/packages/simcore-sdk/requirements/_test.txt index 4dd88313e60..f6dbcf3087f 100644 --- a/packages/simcore-sdk/requirements/_test.txt +++ b/packages/simcore-sdk/requirements/_test.txt @@ -216,12 +216,12 @@ py-partiql-parser==0.6.1 # via moto pycparser==2.22 # via cffi -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../requirements/constraints.txt # -c requirements/_base.txt # aws-sam-translator -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via # -c requirements/_base.txt # pydantic @@ -346,6 +346,11 @@ typing-extensions==4.14.1 # sqlalchemy2-stubs # types-aiobotocore # types-aiobotocore-s3 + # typing-inspection +typing-inspection==0.4.1 + # via + # -c requirements/_base.txt + # pydantic tzdata==2025.1 # via faker urllib3==2.5.0 diff --git a/requirements/constraints.txt b/requirements/constraints.txt index 706be29d117..b839fb276dc 100644 --- a/requirements/constraints.txt +++ b/requirements/constraints.txt @@ -50,6 +50,11 @@ httpx!=0.28.0 # Waiting for fix in respx: https://github.com/lundberg/respx/pul # pydantic>=2.10.0 # Avoids inter-version compatibility serialization errors as: _pickle.UnpicklingError: NEWOBJ class argument must be a type, not _AnnotatedAlias +# See issue https://github.com/ITISFoundation/osparc-simcore/issues/7300 +pydantic-settings<2.7.1 + +# avoid downgrades of openapi-spec-validator related libraries +referencing<=0.35.1 # @@ -66,9 +71,3 @@ pennsieve>=999999999 # User alternative e.g. parametrized fixture or request.getfixturevalue(.) pytest-lazy-fixture>=999999999 - -# avoid downgrades of openapi-spec-validator related libraries -referencing<=0.35.1 - -# See issue https://github.com/ITISFoundation/osparc-simcore/issues/7300 -pydantic-settings<2.7.1 diff --git a/services/agent/requirements/_base.txt b/services/agent/requirements/_base.txt index 1d464efae66..3d223fe81c8 100644 --- a/services/agent/requirements/_base.txt +++ b/services/agent/requirements/_base.txt @@ -296,7 +296,7 @@ psutil==7.0.0 # via -r requirements/../../../packages/service-library/requirements/_base.in pycryptodome==3.21.0 # via stream-zip -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -326,9 +326,9 @@ pydantic==2.10.6 # fastapi # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.2 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in @@ -481,6 +481,9 @@ typing-extensions==4.14.1 # pydantic-extra-types # rich-toolkit # typer + # typing-inspection +typing-inspection==0.4.1 + # via pydantic urllib3==2.5.0 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt diff --git a/services/agent/requirements/_test.txt b/services/agent/requirements/_test.txt index 6a131dc1965..8fc6688ba12 100644 --- a/services/agent/requirements/_test.txt +++ b/services/agent/requirements/_test.txt @@ -202,12 +202,12 @@ py-partiql-parser==0.6.1 # via moto pycparser==2.22 # via cffi -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../requirements/constraints.txt # -c requirements/_base.txt # aws-sam-translator -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via # -c requirements/_base.txt # pydantic @@ -298,6 +298,11 @@ typing-extensions==4.14.1 # cfn-lint # pydantic # pydantic-core + # typing-inspection +typing-inspection==0.4.1 + # via + # -c requirements/_base.txt + # pydantic tzdata==2025.1 # via faker urllib3==2.5.0 diff --git a/services/api-server/VERSION b/services/api-server/VERSION index f374f6662e9..2003b639c40 100644 --- a/services/api-server/VERSION +++ b/services/api-server/VERSION @@ -1 +1 @@ -0.9.1 +0.9.2 diff --git a/services/api-server/openapi.json b/services/api-server/openapi.json index 883c72b81cb..2543e1d0a79 100644 --- a/services/api-server/openapi.json +++ b/services/api-server/openapi.json @@ -3,7 +3,7 @@ "info": { "title": "osparc.io public API", "description": "osparc-simcore public API specifications", - "version": "0.9.1" + "version": "0.9.2" }, "paths": { "/v0/meta": { @@ -5669,7 +5669,8 @@ "schema": { "anyOf": [ { - "type": "object" + "type": "object", + "additionalProperties": true }, { "type": "null" @@ -7529,7 +7530,8 @@ "schema": { "anyOf": [ { - "type": "object" + "type": "object", + "additionalProperties": true }, { "type": "null" @@ -7649,7 +7651,8 @@ "schema": { "anyOf": [ { - "type": "object" + "type": "object", + "additionalProperties": true }, { "type": "null" @@ -7783,7 +7786,8 @@ "items": { "anyOf": [ { - "type": "object" + "type": "object", + "additionalProperties": true }, { "type": "null" @@ -8249,6 +8253,7 @@ "JSONFunctionInputSchema": { "properties": { "schema_content": { + "additionalProperties": true, "type": "object", "title": "JSON Schema", "description": "JSON Schema", @@ -8267,6 +8272,7 @@ "JSONFunctionOutputSchema": { "properties": { "schema_content": { + "additionalProperties": true, "type": "object", "title": "JSON Schema", "description": "JSON Schema", @@ -9994,6 +10000,7 @@ "default_inputs": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -10037,6 +10044,7 @@ "inputs": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -10048,6 +10056,7 @@ "outputs": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -10126,6 +10135,7 @@ "default_inputs": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -10168,6 +10178,7 @@ "inputs": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -10179,6 +10190,7 @@ "outputs": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -10290,6 +10302,7 @@ "default_inputs": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -10345,6 +10358,7 @@ "inputs": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -10356,6 +10370,7 @@ "outputs": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -10446,6 +10461,7 @@ "default_inputs": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -10500,6 +10516,7 @@ "inputs": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -10511,6 +10528,7 @@ "outputs": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -10595,6 +10613,7 @@ "default_inputs": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -10656,6 +10675,7 @@ "inputs": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -10667,6 +10687,7 @@ "outputs": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -10907,6 +10928,7 @@ "default_inputs": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -10956,6 +10978,7 @@ "inputs": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -10967,6 +10990,7 @@ "outputs": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -11015,6 +11039,7 @@ "content_schema": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -11098,6 +11123,7 @@ "content_schema": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -11261,7 +11287,6 @@ }, "workspace_path": { "type": "string", - "pattern": "^workspace/.*", "format": "path", "title": "Workspace Path", "description": "The file's relative path within the job's workspace directory. E.g. 'workspace/myfile.txt'" diff --git a/services/api-server/requirements/_base.txt b/services/api-server/requirements/_base.txt index 965a53d7f11..b93d186b0dd 100644 --- a/services/api-server/requirements/_base.txt +++ b/services/api-server/requirements/_base.txt @@ -512,7 +512,7 @@ pycparser==2.22 # via cffi pycryptodome==3.21.0 # via stream-zip -pydantic==2.10.3 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -575,9 +575,9 @@ pydantic==2.10.3 # fastapi-pagination # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.1 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.0 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in @@ -597,7 +597,7 @@ pydantic-extra-types==2.10.0 # -r requirements/../../../packages/simcore-sdk/requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/_base.in # -r requirements/../../../packages/simcore-sdk/requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/simcore-sdk/requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/_base.in -pydantic-settings==2.6.1 +pydantic-settings==2.7.0 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -856,6 +856,9 @@ typing-extensions==4.14.1 # pydantic-extra-types # rich-toolkit # typer + # typing-inspection +typing-inspection==0.4.1 + # via pydantic urllib3==2.5.0 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt diff --git a/services/api-server/requirements/_test.txt b/services/api-server/requirements/_test.txt index 1fef740d8b3..a3a2bc1690e 100644 --- a/services/api-server/requirements/_test.txt +++ b/services/api-server/requirements/_test.txt @@ -245,12 +245,12 @@ pycparser==2.22 # via # -c requirements/_base.txt # cffi -pydantic==2.10.3 +pydantic==2.11.7 # via # -c requirements/../../../requirements/constraints.txt # -c requirements/_base.txt # fastapi -pydantic-core==2.27.1 +pydantic-core==2.33.2 # via # -c requirements/_base.txt # pydantic @@ -385,6 +385,11 @@ typing-extensions==4.14.1 # pydantic-core # sqlalchemy2-stubs # types-boto3 + # typing-inspection +typing-inspection==0.4.1 + # via + # -c requirements/_base.txt + # pydantic tzdata==2025.1 # via faker urllib3==2.5.0 diff --git a/services/api-server/setup.cfg b/services/api-server/setup.cfg index 6f7fe90adca..6bd6174290b 100644 --- a/services/api-server/setup.cfg +++ b/services/api-server/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.9.1 +current_version = 0.9.2 commit = True message = services/api-server version: {current_version} → {new_version} tag = False diff --git a/services/api-server/src/simcore_service_api_server/core/settings.py b/services/api-server/src/simcore_service_api_server/core/settings.py index cf734ed1040..59f6812b896 100644 --- a/services/api-server/src/simcore_service_api_server/core/settings.py +++ b/services/api-server/src/simcore_service_api_server/core/settings.py @@ -35,7 +35,7 @@ class WebServerSettings(WebServerBaseSettings, MixinSessionSettings): 'TIP: python3 -c "from cryptography.fernet import *; print(Fernet.generate_key())"', min_length=44, validation_alias=AliasChoices( - "SESSION_SECRET_KEY", "WEBSERVER_SESSION_SECRET_KEY" + "WEBSERVER_SESSION_SECRET_KEY", "SESSION_SECRET_KEY" ), ), ] @@ -65,9 +65,7 @@ class BasicSettings(BaseCustomSettings, MixinLoggingSettings): LOG_LEVEL: Annotated[ LogLevel, Field( - validation_alias=AliasChoices( - "API_SERVER_LOGLEVEL", "LOG_LEVEL", "LOGLEVEL" - ), + validation_alias=AliasChoices("API_SERVER_LOGLEVEL", "LOGLEVEL"), ), ] = LogLevel.INFO diff --git a/services/api-server/tests/unit/test_services_solver_job_models_converters.py b/services/api-server/tests/unit/test_services_solver_job_models_converters.py index 5be97bdca2a..c12bf647b6f 100644 --- a/services/api-server/tests/unit/test_services_solver_job_models_converters.py +++ b/services/api-server/tests/unit/test_services_solver_job_models_converters.py @@ -225,8 +225,10 @@ def fake_url_for(*args, **kwargs) -> HttpUrl: assert job.id == project.uuid + field_names = Job.model_fields.keys() + non_propagated_fields = { - name for name in job.model_fields if name.endswith("url") + name for name in field_names if name.endswith("url") }.union({"name"}) assert all(getattr(job, _) for _ in non_propagated_fields) diff --git a/services/autoscaling/requirements/_base.txt b/services/autoscaling/requirements/_base.txt index 30cd6787e19..f8991b81564 100644 --- a/services/autoscaling/requirements/_base.txt +++ b/services/autoscaling/requirements/_base.txt @@ -476,7 +476,7 @@ psutil==7.0.0 # distributed pycryptodome==3.23.0 # via stream-zip -pydantic==2.11.4 +pydantic==2.11.7 # via # -c requirements/../../../packages/aws-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/aws-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -531,7 +531,7 @@ pydantic==2.11.4 # pydantic-settings pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.4 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/aws-library/requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/aws-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in diff --git a/services/autoscaling/requirements/_test.txt b/services/autoscaling/requirements/_test.txt index 2b1f4362527..bf95c3c2725 100644 --- a/services/autoscaling/requirements/_test.txt +++ b/services/autoscaling/requirements/_test.txt @@ -188,7 +188,7 @@ py-partiql-parser==0.6.1 # via moto pycparser==2.22 # via cffi -pydantic==2.11.4 +pydantic==2.11.7 # via # -c requirements/../../../requirements/constraints.txt # -c requirements/_base.txt diff --git a/services/catalog/VERSION b/services/catalog/VERSION index c18d72be303..53a48a1e8c6 100644 --- a/services/catalog/VERSION +++ b/services/catalog/VERSION @@ -1 +1 @@ -0.8.1 \ No newline at end of file +0.8.2 \ No newline at end of file diff --git a/services/catalog/openapi.json b/services/catalog/openapi.json index 4295d0ebd1c..652ef43537e 100644 --- a/services/catalog/openapi.json +++ b/services/catalog/openapi.json @@ -3,7 +3,7 @@ "info": { "title": "simcore-service-catalog", "description": "Manages and maintains a catalog of all published components (e.g. macro-algorithms, scripts, etc)", - "version": "0.8.1" + "version": "0.8.2" }, "paths": { "/": { @@ -172,6 +172,7 @@ "application/json": { "schema": { "type": "object", + "additionalProperties": true, "title": "Response Get Service Labels V0 Services Service Key Service Version Labels Get" } } @@ -839,6 +840,7 @@ "Runtime": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -1534,6 +1536,7 @@ "Global": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -1556,6 +1559,7 @@ "GlobalJob": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -2688,6 +2692,7 @@ "title": "Classifiers" }, "quality": { + "additionalProperties": true, "type": "object", "title": "Quality", "default": {} @@ -2933,6 +2938,7 @@ "contentSchema": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -3044,6 +3050,7 @@ "contentSchema": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -3130,6 +3137,7 @@ "content_schema": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { diff --git a/services/catalog/requirements/_base.txt b/services/catalog/requirements/_base.txt index 29933b1628c..a69012ff573 100644 --- a/services/catalog/requirements/_base.txt +++ b/services/catalog/requirements/_base.txt @@ -338,7 +338,7 @@ psycopg2-binary==2.9.10 # via sqlalchemy pycryptodome==3.21.0 # via stream-zip -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -372,9 +372,9 @@ pydantic==2.10.6 # fastapi # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.3 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in @@ -561,6 +561,9 @@ typing-extensions==4.14.1 # pydantic-extra-types # rich-toolkit # typer + # typing-inspection +typing-inspection==0.4.1 + # via pydantic urllib3==2.5.0 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt diff --git a/services/catalog/setup.cfg b/services/catalog/setup.cfg index 812aa1c836c..cce4210c9f9 100644 --- a/services/catalog/setup.cfg +++ b/services/catalog/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.8.1 +current_version = 0.8.2 commit = True message = services/catalog version: {current_version} → {new_version} tag = False @@ -10,10 +10,10 @@ commit_args = --no-verify [tool:pytest] asyncio_mode = auto asyncio_default_fixture_loop_scope = function -markers = +markers = testit: "marks test to run during development" [mypy] -plugins = +plugins = pydantic.mypy sqlalchemy.ext.mypy.plugin diff --git a/services/clusters-keeper/requirements/_base.txt b/services/clusters-keeper/requirements/_base.txt index 1fdae0cd08e..21aa26e78d1 100644 --- a/services/clusters-keeper/requirements/_base.txt +++ b/services/clusters-keeper/requirements/_base.txt @@ -474,7 +474,7 @@ psutil==7.0.0 # distributed pycryptodome==3.23.0 # via stream-zip -pydantic==2.11.4 +pydantic==2.11.7 # via # -c requirements/../../../packages/aws-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/aws-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -529,7 +529,7 @@ pydantic==2.11.4 # pydantic-settings pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.4 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/aws-library/requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/aws-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in diff --git a/services/clusters-keeper/requirements/_test.txt b/services/clusters-keeper/requirements/_test.txt index 72fbfbe1149..ea7958add8f 100644 --- a/services/clusters-keeper/requirements/_test.txt +++ b/services/clusters-keeper/requirements/_test.txt @@ -215,7 +215,7 @@ py-partiql-parser==0.6.1 # via moto pycparser==2.22 # via cffi -pydantic==2.11.4 +pydantic==2.11.7 # via # -c requirements/../../../requirements/constraints.txt # -c requirements/_base.txt diff --git a/services/dask-sidecar/requirements/_base.txt b/services/dask-sidecar/requirements/_base.txt index fe8973b82ac..45a5068c28f 100644 --- a/services/dask-sidecar/requirements/_base.txt +++ b/services/dask-sidecar/requirements/_base.txt @@ -327,7 +327,7 @@ psutil==7.0.0 # distributed pycryptodome==3.23.0 # via stream-zip -pydantic==2.11.4 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/dask-task-models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -370,7 +370,7 @@ pydantic==2.11.4 # pydantic-settings pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.4 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/dask-task-models-library/requirements/../../../packages/common-library/requirements/_base.in diff --git a/services/dask-sidecar/requirements/_test.txt b/services/dask-sidecar/requirements/_test.txt index 0b9a3fb7984..fd185f11ef9 100644 --- a/services/dask-sidecar/requirements/_test.txt +++ b/services/dask-sidecar/requirements/_test.txt @@ -198,7 +198,7 @@ py-partiql-parser==0.6.1 # via moto pycparser==2.22 # via cffi -pydantic==2.11.4 +pydantic==2.11.7 # via # -c requirements/../../../requirements/constraints.txt # -c requirements/_base.txt diff --git a/services/datcore-adapter/requirements/_base.txt b/services/datcore-adapter/requirements/_base.txt index 1d1a56db025..5fc065474e5 100644 --- a/services/datcore-adapter/requirements/_base.txt +++ b/services/datcore-adapter/requirements/_base.txt @@ -306,7 +306,7 @@ psutil==6.0.0 # via -r requirements/../../../packages/service-library/requirements/_base.in pycryptodome==3.21.0 # via stream-zip -pydantic==2.10.2 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -337,9 +337,9 @@ pydantic==2.10.2 # fastapi-pagination # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.1 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.9.0 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in @@ -349,7 +349,7 @@ pydantic-extra-types==2.9.0 # -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/settings-library/requirements/../../../packages/common-library/requirements/_base.in -pydantic-settings==2.6.1 +pydantic-settings==2.7.0 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -498,8 +498,12 @@ typing-extensions==4.14.1 # opentelemetry-semantic-conventions # pydantic # pydantic-core + # pydantic-extra-types # rich-toolkit # typer + # typing-inspection +typing-inspection==0.4.1 + # via pydantic urllib3==2.5.0 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt diff --git a/services/director-v2/requirements/_base.txt b/services/director-v2/requirements/_base.txt index fa681702302..1f17e93adbf 100644 --- a/services/director-v2/requirements/_base.txt +++ b/services/director-v2/requirements/_base.txt @@ -577,7 +577,7 @@ psycopg2-binary==2.9.10 # via sqlalchemy pycryptodome==3.23.0 # via stream-zip -pydantic==2.11.4 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/dask-task-models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -653,7 +653,7 @@ pydantic==2.11.4 # pydantic-settings pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.4 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/dask-task-models-library/requirements/../../../packages/common-library/requirements/_base.in diff --git a/services/director/requirements/_base.txt b/services/director/requirements/_base.txt index 6ef54b4d79a..733fdc9a602 100644 --- a/services/director/requirements/_base.txt +++ b/services/director/requirements/_base.txt @@ -296,7 +296,7 @@ psutil==6.1.0 # via -r requirements/../../../packages/service-library/requirements/_base.in pycryptodome==3.21.0 # via stream-zip -pydantic==2.10.2 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -326,9 +326,9 @@ pydantic==2.10.2 # fastapi # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.1 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.0 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in @@ -338,7 +338,7 @@ pydantic-extra-types==2.10.0 # -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/settings-library/requirements/../../../packages/common-library/requirements/_base.in -pydantic-settings==2.6.1 +pydantic-settings==2.7.0 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -480,6 +480,9 @@ typing-extensions==4.14.1 # pydantic-core # pydantic-extra-types # typer + # typing-inspection +typing-inspection==0.4.1 + # via pydantic urllib3==2.5.0 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt diff --git a/services/docker-api-proxy/requirements/_test.txt b/services/docker-api-proxy/requirements/_test.txt index eb54be7a518..b5374ea6b16 100644 --- a/services/docker-api-proxy/requirements/_test.txt +++ b/services/docker-api-proxy/requirements/_test.txt @@ -231,7 +231,7 @@ psutil==7.0.0 # via -r requirements/../../../packages/service-library/requirements/_base.in pycryptodome==3.21.0 # via stream-zip -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -260,9 +260,9 @@ pydantic==2.10.6 # fastapi # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.2 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in @@ -428,6 +428,9 @@ typing-extensions==4.14.1 # pydantic-core # pydantic-extra-types # typer + # typing-inspection +typing-inspection==0.4.1 + # via pydantic tzdata==2025.1 # via faker urllib3==2.5.0 diff --git a/services/dynamic-scheduler/requirements/_base.txt b/services/dynamic-scheduler/requirements/_base.txt index f567b600917..04ced245a5f 100644 --- a/services/dynamic-scheduler/requirements/_base.txt +++ b/services/dynamic-scheduler/requirements/_base.txt @@ -356,7 +356,7 @@ psycopg2-binary==2.9.10 # via sqlalchemy pycryptodome==3.21.0 # via stream-zip -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -389,9 +389,9 @@ pydantic==2.10.6 # fastapi # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.2 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in @@ -590,6 +590,9 @@ typing-extensions==4.14.1 # pydantic-extra-types # rich-toolkit # typer + # typing-inspection +typing-inspection==0.4.1 + # via pydantic u-msgpack-python==2.8.0 # via -r requirements/_base.in urllib3==2.5.0 diff --git a/services/dynamic-sidecar/VERSION b/services/dynamic-sidecar/VERSION index 26aaba0e866..6085e946503 100644 --- a/services/dynamic-sidecar/VERSION +++ b/services/dynamic-sidecar/VERSION @@ -1 +1 @@ -1.2.0 +1.2.1 diff --git a/services/dynamic-sidecar/openapi.json b/services/dynamic-sidecar/openapi.json index 442005a03c1..5e51d9d362a 100644 --- a/services/dynamic-sidecar/openapi.json +++ b/services/dynamic-sidecar/openapi.json @@ -3,7 +3,7 @@ "info": { "title": "simcore-service-dynamic-sidecar", "description": "Implements a sidecar service to manage user's dynamic/interactive services", - "version": "1.2.0" + "version": "1.2.1" }, "servers": [ { @@ -139,6 +139,7 @@ "application/json": { "schema": { "type": "object", + "additionalProperties": true, "title": "Response Containers Docker Inspect V1 Containers Get" } } @@ -261,7 +262,8 @@ "type": "string" }, { - "type": "object" + "type": "object", + "additionalProperties": true } ], "title": "Response Get Containers Name V1 Containers Name Get" @@ -304,6 +306,7 @@ "application/json": { "schema": { "type": "object", + "additionalProperties": true, "title": "Response Inspect Container V1 Containers Id Get" } } @@ -986,6 +989,7 @@ "title": "Service Resources" }, "service_additional_metadata": { + "additionalProperties": true, "type": "object", "title": "Service Additional Metadata" } @@ -1230,6 +1234,7 @@ "contentSchema": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { diff --git a/services/dynamic-sidecar/requirements/_base.txt b/services/dynamic-sidecar/requirements/_base.txt index b12b39ea08f..d830f459196 100644 --- a/services/dynamic-sidecar/requirements/_base.txt +++ b/services/dynamic-sidecar/requirements/_base.txt @@ -481,7 +481,7 @@ psycopg2-binary==2.9.10 # via sqlalchemy pycryptodome==3.21.0 # via stream-zip -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -543,9 +543,9 @@ pydantic==2.10.6 # fastapi # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.2 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in @@ -857,6 +857,9 @@ typing-extensions==4.14.1 # pydantic-extra-types # rich-toolkit # typer + # typing-inspection +typing-inspection==0.4.1 + # via pydantic u-msgpack-python==2.8.0 # via -r requirements/_base.in urllib3==2.5.0 diff --git a/services/dynamic-sidecar/setup.cfg b/services/dynamic-sidecar/setup.cfg index e02fb54d462..92696537f9a 100644 --- a/services/dynamic-sidecar/setup.cfg +++ b/services/dynamic-sidecar/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.2.0 +current_version = 1.2.1 commit = True message = services/dynamic-sidecar version: {current_version} → {new_version} tag = False @@ -10,9 +10,9 @@ commit_args = --no-verify [tool:pytest] asyncio_mode = auto asyncio_default_fixture_loop_scope = function -markers = +markers = testit: "marks test to run during development" [mypy] -plugins = +plugins = pydantic.mypy diff --git a/services/invitations/requirements/_base.txt b/services/invitations/requirements/_base.txt index 086fedaae62..361e11fb160 100644 --- a/services/invitations/requirements/_base.txt +++ b/services/invitations/requirements/_base.txt @@ -313,7 +313,7 @@ pycparser==2.22 # via cffi pycryptodome==3.21.0 # via stream-zip -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -342,9 +342,9 @@ pydantic==2.10.6 # fastapi # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.3 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in @@ -498,6 +498,9 @@ typing-extensions==4.14.1 # pydantic-extra-types # rich-toolkit # typer + # typing-inspection +typing-inspection==0.4.1 + # via pydantic urllib3==2.5.0 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt diff --git a/services/notifications/requirements/_base.txt b/services/notifications/requirements/_base.txt index 19ae7bdf0b0..85f427e1d6c 100644 --- a/services/notifications/requirements/_base.txt +++ b/services/notifications/requirements/_base.txt @@ -332,7 +332,7 @@ psycopg2-binary==2.9.10 # via sqlalchemy pycryptodome==3.22.0 # via stream-zip -pydantic==2.11.0 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -366,9 +366,9 @@ pydantic==2.11.0 # fastapi # pydantic-extra-types # pydantic-settings -pydantic-core==2.33.0 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.3 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in diff --git a/services/payments/openapi.json b/services/payments/openapi.json index 3a0aaf09fb7..5809e58228e 100644 --- a/services/payments/openapi.json +++ b/services/payments/openapi.json @@ -449,6 +449,9 @@ }, "docs_url": { "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri", "title": "Docs Url" } }, diff --git a/services/payments/requirements/_base.txt b/services/payments/requirements/_base.txt index d30616deff8..e1a012cbb07 100644 --- a/services/payments/requirements/_base.txt +++ b/services/payments/requirements/_base.txt @@ -365,7 +365,7 @@ pycparser==2.22 # via cffi pycryptodome==3.21.0 # via stream-zip -pydantic==2.10.2 +pydantic==2.11.7 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -398,9 +398,9 @@ pydantic==2.10.2 # fastapi # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.1 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.0 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in @@ -411,7 +411,7 @@ pydantic-extra-types==2.10.0 # -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/settings-library/requirements/../../../packages/common-library/requirements/_base.in -pydantic-settings==2.6.1 +pydantic-settings==2.7.0 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -614,6 +614,9 @@ typing-extensions==4.14.1 # pydantic-extra-types # rich-toolkit # typer + # typing-inspection +typing-inspection==0.4.1 + # via pydantic urllib3==2.5.0 # via # -c requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt diff --git a/services/resource-usage-tracker/VERSION b/services/resource-usage-tracker/VERSION index 3eefcb9dd5b..7dea76edb3d 100644 --- a/services/resource-usage-tracker/VERSION +++ b/services/resource-usage-tracker/VERSION @@ -1 +1 @@ -1.0.0 +1.0.1 diff --git a/services/resource-usage-tracker/openapi.json b/services/resource-usage-tracker/openapi.json index cef757856bf..abad2c654aa 100644 --- a/services/resource-usage-tracker/openapi.json +++ b/services/resource-usage-tracker/openapi.json @@ -3,7 +3,7 @@ "info": { "title": "simcore-service-resource-usage-tracker web API", "description": "Service that collects and stores computational resources usage used in osparc-simcore", - "version": "1.0.0" + "version": "1.0.1" }, "paths": { "/": { @@ -605,6 +605,9 @@ }, "docs_url": { "type": "string", + "maxLength": 2083, + "minLength": 1, + "format": "uri", "title": "Docs Url" } }, diff --git a/services/resource-usage-tracker/requirements/_base.txt b/services/resource-usage-tracker/requirements/_base.txt index 0246f4bf89c..4f0e4a27cd9 100644 --- a/services/resource-usage-tracker/requirements/_base.txt +++ b/services/resource-usage-tracker/requirements/_base.txt @@ -506,7 +506,7 @@ psycopg2-binary==2.9.9 # via sqlalchemy pycryptodome==3.21.0 # via stream-zip -pydantic==2.10.2 +pydantic==2.11.7 # via # -c requirements/../../../packages/aws-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/aws-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -563,9 +563,9 @@ pydantic==2.10.2 # fastapi # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.1 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.9.0 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/aws-library/requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/aws-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in @@ -584,7 +584,7 @@ pydantic-extra-types==2.9.0 # -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/settings-library/requirements/../../../packages/common-library/requirements/_base.in -pydantic-settings==2.6.1 +pydantic-settings==2.7.0 # via # -c requirements/../../../packages/aws-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/aws-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -881,12 +881,16 @@ typing-extensions==4.14.1 # opentelemetry-semantic-conventions # pydantic # pydantic-core + # pydantic-extra-types # rich-toolkit # typer # types-aiobotocore # types-aiobotocore-ec2 # types-aiobotocore-s3 # types-aiobotocore-ssm + # typing-inspection +typing-inspection==0.4.1 + # via pydantic tzdata==2024.1 # via pandas tzlocal==5.2 diff --git a/services/resource-usage-tracker/requirements/_test.txt b/services/resource-usage-tracker/requirements/_test.txt index 1ce6affb8d8..6ffb5d4cb7d 100644 --- a/services/resource-usage-tracker/requirements/_test.txt +++ b/services/resource-usage-tracker/requirements/_test.txt @@ -189,12 +189,12 @@ py-partiql-parser==0.6.1 # via moto pycparser==2.22 # via cffi -pydantic==2.10.2 +pydantic==2.11.7 # via # -c requirements/../../../requirements/constraints.txt # -c requirements/_base.txt # aws-sam-translator -pydantic-core==2.27.1 +pydantic-core==2.33.2 # via # -c requirements/_base.txt # pydantic @@ -320,6 +320,11 @@ typing-extensions==4.14.1 # pydantic # pydantic-core # sqlalchemy2-stubs + # typing-inspection +typing-inspection==0.4.1 + # via + # -c requirements/_base.txt + # pydantic tzdata==2024.1 # via # -c requirements/_base.txt diff --git a/services/resource-usage-tracker/setup.cfg b/services/resource-usage-tracker/setup.cfg index 1dbddd94448..361d4cd4c06 100644 --- a/services/resource-usage-tracker/setup.cfg +++ b/services/resource-usage-tracker/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.0.0 +current_version = 1.0.1 commit = True message = services/resource-usage-tracker version: {current_version} → {new_version} tag = False @@ -10,9 +10,10 @@ commit_args = --no-verify [tool:pytest] asyncio_mode = auto asyncio_default_fixture_loop_scope = function -markers = +markers = testit: "marks test to run during development" + [mypy] -plugins = +plugins = pydantic.mypy sqlalchemy.ext.mypy.plugin diff --git a/services/storage/VERSION b/services/storage/VERSION index faef31a4357..39e898a4f95 100644 --- a/services/storage/VERSION +++ b/services/storage/VERSION @@ -1 +1 @@ -0.7.0 +0.7.1 diff --git a/services/storage/openapi.json b/services/storage/openapi.json index 6f73e78bce7..527eec0d03c 100644 --- a/services/storage/openapi.json +++ b/services/storage/openapi.json @@ -3,7 +3,7 @@ "info": { "title": "simcore_service_storage", "description": "Service that manages osparc storage backend", - "version": "0.7.0" + "version": "0.7.1" }, "paths": { "/v0/": { @@ -1374,6 +1374,7 @@ "description": "Application's version" }, "services": { + "additionalProperties": true, "type": "object", "title": "Services", "description": "Other backend services connected from this service", @@ -1382,6 +1383,7 @@ "sessions": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -1812,6 +1814,7 @@ "data": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -2511,7 +2514,6 @@ "title": "S3 Secret Key" } }, - "additionalProperties": false, "type": "object", "required": [ "S3_ACCESS_KEY", diff --git a/services/storage/requirements/_base.txt b/services/storage/requirements/_base.txt index 7ce06dca5ac..48bb3d2baa8 100644 --- a/services/storage/requirements/_base.txt +++ b/services/storage/requirements/_base.txt @@ -618,7 +618,7 @@ psycopg2-binary==2.9.10 # via sqlalchemy pycryptodome==3.21.0 # via stream-zip -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../packages/aws-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/aws-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -700,9 +700,9 @@ pydantic==2.10.6 # fastapi-pagination # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.2 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/aws-library/requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/aws-library/requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in @@ -1110,6 +1110,9 @@ typing-extensions==4.14.1 # types-aiobotocore-ec2 # types-aiobotocore-s3 # types-aiobotocore-ssm + # typing-inspection +typing-inspection==0.4.1 + # via pydantic tzdata==2025.2 # via kombu urllib3==2.5.0 diff --git a/services/storage/requirements/_test.txt b/services/storage/requirements/_test.txt index 6833ef88e26..5cf71f7fbac 100644 --- a/services/storage/requirements/_test.txt +++ b/services/storage/requirements/_test.txt @@ -270,12 +270,12 @@ py-partiql-parser==0.6.1 # via moto pycparser==2.22 # via cffi -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../requirements/constraints.txt # -c requirements/_base.txt # aws-sam-translator -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via # -c requirements/_base.txt # pydantic @@ -417,6 +417,11 @@ typing-extensions==4.14.1 # pydantic # pydantic-core # sqlalchemy2-stubs + # typing-inspection +typing-inspection==0.4.1 + # via + # -c requirements/_base.txt + # pydantic tzdata==2025.2 # via # -c requirements/_base.txt diff --git a/services/storage/setup.cfg b/services/storage/setup.cfg index 6c4b25275d5..34668cb65b9 100644 --- a/services/storage/setup.cfg +++ b/services/storage/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.7.0 +current_version = 0.7.1 commit = True message = services/storage api version: {current_version} → {new_version} tag = False @@ -10,13 +10,13 @@ commit_args = --no-verify [tool:pytest] asyncio_mode = auto asyncio_default_fixture_loop_scope = function -markers = +markers = slow: marks tests as slow (deselect with '-m "not slow"') acceptance_test: "marks tests as 'acceptance tests' i.e. does the system do what the user expects? Typically those are workflows." testit: "marks test to run during development" heavy_load: "mark tests that require large amount of data" [mypy] -plugins = +plugins = pydantic.mypy sqlalchemy.ext.mypy.plugin diff --git a/services/web/server/VERSION b/services/web/server/VERSION index e6c73154d93..5e5d529aada 100644 --- a/services/web/server/VERSION +++ b/services/web/server/VERSION @@ -1 +1 @@ -0.71.0 +0.71.1 diff --git a/services/web/server/requirements/_base.txt b/services/web/server/requirements/_base.txt index e0c48caa415..b2a23208960 100644 --- a/services/web/server/requirements/_base.txt +++ b/services/web/server/requirements/_base.txt @@ -614,7 +614,7 @@ pycparser==2.21 # via cffi pycryptodome==3.21.0 # via stream-zip -pydantic==2.10.2 +pydantic==2.11.7 # via # -c requirements/../../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -652,7 +652,6 @@ pydantic==2.10.2 # -c requirements/../../../../packages/simcore-sdk/requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../../packages/simcore-sdk/requirements/../../../requirements/constraints.txt # -c requirements/../../../../requirements/constraints.txt - # -c 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 @@ -691,9 +690,9 @@ pydantic==2.10.2 # fast-depends # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.1 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.9.0 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../../packages/common-library/requirements/_base.in # -r requirements/../../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in @@ -718,7 +717,7 @@ pydantic-extra-types==2.9.0 # -r requirements/../../../../packages/simcore-sdk/requirements/../../../packages/service-library/requirements/../../../packages/models-library/requirements/_base.in # -r requirements/../../../../packages/simcore-sdk/requirements/../../../packages/service-library/requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../../packages/simcore-sdk/requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/_base.in -pydantic-settings==2.5.2 +pydantic-settings==2.7.0 # via # -c requirements/../../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt @@ -987,7 +986,11 @@ typing-extensions==4.14.1 # pint # pydantic # pydantic-core + # pydantic-extra-types # typer + # typing-inspection +typing-inspection==0.4.1 + # via pydantic urllib3==2.5.0 # via # -c requirements/../../../../packages/common-library/requirements/../../../requirements/constraints.txt diff --git a/services/web/server/requirements/_test.txt b/services/web/server/requirements/_test.txt index c019dafc4af..8f7e0133255 100644 --- a/services/web/server/requirements/_test.txt +++ b/services/web/server/requirements/_test.txt @@ -191,13 +191,13 @@ propcache==0.3.1 # yarl py-cpuinfo==9.0.0 # via pytest-benchmark -pydantic==2.10.2 +pydantic==2.11.7 # via # -c requirements/../../../../requirements/constraints.txt # -c requirements/_base.txt # fastapi # fastapi-pagination -pydantic-core==2.27.1 +pydantic-core==2.33.2 # via # -c requirements/_base.txt # pydantic @@ -342,6 +342,11 @@ typing-extensions==4.14.1 # pydantic-core # sqlalchemy2-stubs # typer + # typing-inspection +typing-inspection==0.4.1 + # via + # -c requirements/_base.txt + # pydantic urllib3==2.5.0 # via # -c requirements/../../../../requirements/constraints.txt diff --git a/services/web/server/requirements/constraints.txt b/services/web/server/requirements/constraints.txt index 71c712593cb..da024164311 100644 --- a/services/web/server/requirements/constraints.txt +++ b/services/web/server/requirements/constraints.txt @@ -7,6 +7,3 @@ # SEE services/web/server/tests/unit/isolated/test_utils.py::test_yarl_new_url_generation for properly usage yarl>=1.8.2 frozenlist>=1.3.1 - -# See: https://github.com/pydantic/pydantic/issues/4011 -pydantic>=1.10 diff --git a/services/web/server/setup.cfg b/services/web/server/setup.cfg index 05cf7cceee2..a7d95433e23 100644 --- a/services/web/server/setup.cfg +++ b/services/web/server/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.71.0 +current_version = 0.71.1 commit = True message = services/webserver api version: {current_version} → {new_version} tag = False diff --git a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml index 30131162154..6bad4a0bb53 100644 --- a/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml +++ b/services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml @@ -2,7 +2,7 @@ openapi: 3.1.0 info: title: simcore-service-webserver description: Main service with an interface (http-API & websockets) to the web front-end - version: 0.71.0 + version: 0.71.1 servers: - url: '' description: webserver @@ -8488,6 +8488,7 @@ components: AccountRequestInfo: properties: form: + additionalProperties: true type: object title: Form captcha: @@ -8556,6 +8557,7 @@ components: - type: 'null' title: Color attributes: + additionalProperties: true type: object title: Attributes description: svg attributes @@ -8579,6 +8581,7 @@ components: type: string title: Color attributes: + additionalProperties: true type: object title: Attributes description: svg attributes @@ -8675,6 +8678,9 @@ components: apiBaseUrl: anyOf: - type: string + maxLength: 2083 + minLength: 1 + format: uri - type: 'null' title: Apibaseurl apiKey: @@ -8717,13 +8723,15 @@ components: title: Version description: Application's version services: + additionalProperties: true type: object title: Services description: Other backend services connected from this service default: {} sessions: anyOf: - - type: object + - additionalProperties: true + type: object - type: 'null' title: Sessions description: Client sessions info. If single session per app, then is denoted @@ -8732,12 +8740,16 @@ components: url: anyOf: - type: string + minLength: 1 + format: uri - type: 'null' title: Url description: Link to current resource diagnostics_url: anyOf: - type: string + minLength: 1 + format: uri - type: 'null' title: Diagnostics Url description: Link to diagnostics report sub-resource. This MIGHT take some @@ -8854,11 +8866,17 @@ components: thumbnail: anyOf: - type: string + maxLength: 2083 + minLength: 1 + format: uri - type: 'null' title: Thumbnail icon: anyOf: - type: string + maxLength: 2083 + minLength: 1 + format: uri - type: 'null' title: Icon descriptionUi: @@ -8910,6 +8928,7 @@ components: - type: 'null' title: Classifiers quality: + additionalProperties: true type: object title: Quality release: @@ -9073,11 +9092,17 @@ components: thumbnail: anyOf: - type: string + maxLength: 2083 + minLength: 1 + format: uri - type: 'null' title: Thumbnail icon: anyOf: - type: string + maxLength: 2083 + minLength: 1 + format: uri - type: 'null' title: Icon descriptionUi: @@ -9131,6 +9156,7 @@ components: - type: 'null' title: Classifiers quality: + additionalProperties: true type: object title: Quality history: @@ -9273,6 +9299,7 @@ components: - type: 'null' title: Classifiers quality: + additionalProperties: true type: object title: Quality default: {} @@ -9371,6 +9398,7 @@ components: state: $ref: '#/components/schemas/RunningState' info: + additionalProperties: true type: object title: Info submittedAt: @@ -9419,6 +9447,7 @@ components: type: number title: Progress image: + additionalProperties: true type: object title: Image startedAt: @@ -9436,6 +9465,8 @@ components: logDownloadLink: anyOf: - type: string + minLength: 1 + format: uri - type: 'null' title: Logdownloadlink osparcCredits: @@ -9513,11 +9544,15 @@ components: task url: type: string + minLength: 1 + format: uri title: Url description: the link where to get the status of the task stop_url: anyOf: - type: string + minLength: 1 + format: uri - type: 'null' title: Stop Url description: the link where to stop the task @@ -9544,6 +9579,7 @@ components: state: $ref: '#/components/schemas/RunningState' info: + additionalProperties: true type: object title: Info submittedAt: @@ -9566,6 +9602,7 @@ components: type: string title: Rootprojectname projectCustomMetadata: + additionalProperties: true type: object title: Projectcustommetadata type: object @@ -9629,6 +9666,7 @@ components: type: number title: Progress image: + additionalProperties: true type: object title: Image startedAt: @@ -9646,6 +9684,8 @@ components: logDownloadLink: anyOf: - type: string + minLength: 1 + format: uri - type: 'null' title: Logdownloadlink nodeName: @@ -10069,9 +10109,11 @@ components: EmailTestPassed: properties: fixtures: + additionalProperties: true type: object title: Fixtures info: + additionalProperties: true type: object title: Info type: object @@ -10111,6 +10153,8 @@ components: data: anyOf: - type: string + minLength: 1 + format: uri - type: 'null' title: Data error: @@ -11116,7 +11160,8 @@ components: properties: data: anyOf: - - type: object + - additionalProperties: true + type: object - type: 'null' title: Data error: @@ -11939,6 +11984,8 @@ components: properties: state: type: string + minLength: 1 + format: uri title: State type: object required: @@ -11973,9 +12020,13 @@ components: properties: abort_upload: type: string + minLength: 1 + format: uri title: Abort Upload complete_upload: type: string + minLength: 1 + format: uri title: Complete Upload type: object required: @@ -11991,6 +12042,8 @@ components: urls: items: type: string + minLength: 1 + format: uri type: array title: Urls links: @@ -12219,6 +12272,8 @@ components: thumbnail: anyOf: - type: string + minLength: 1 + format: uri - type: 'null' title: Thumbnail description: url to the group thumbnail @@ -12515,6 +12570,9 @@ components: title: Created invitationLink: type: string + maxLength: 2083 + minLength: 1 + format: uri title: Invitationlink type: object required: @@ -12539,6 +12597,7 @@ components: JSONFunctionInputSchema: properties: schema_content: + additionalProperties: true type: object title: JSON Schema description: JSON Schema @@ -12553,6 +12612,7 @@ components: JSONFunctionOutputSchema: properties: schema_content: + additionalProperties: true type: object title: JSON Schema description: JSON Schema @@ -12682,11 +12742,17 @@ components: categoryIcon: anyOf: - type: string + maxLength: 2083 + minLength: 1 + format: uri - type: 'null' title: Categoryicon termsOfUseUrl: anyOf: - type: string + maxLength: 2083 + minLength: 1 + format: uri - type: 'null' title: Termsofuseurl createdAt: @@ -13316,6 +13382,10 @@ components: thumbnail: anyOf: - type: string + - type: string + maxLength: 2083 + minLength: 1 + format: uri - type: 'null' title: Thumbnail description: url of the latest screenshot of the node @@ -13489,7 +13559,6 @@ components: exclusiveMinimum: true title: Serviceport description: port to access the service within the network - default: 8080 maximum: 65535 minimum: 0 serviceBasepath: @@ -13526,6 +13595,7 @@ components: - serviceKey - serviceVersion - serviceHost + - servicePort - serviceState - userId title: NodeGet @@ -13568,6 +13638,7 @@ components: NodeOutputs: properties: outputs: + additionalProperties: true type: object title: Outputs type: object @@ -13622,12 +13693,14 @@ components: title: Progress bootOptions: anyOf: - - type: object + - additionalProperties: true + type: object - type: 'null' title: Bootoptions outputs: anyOf: - - type: object + - additionalProperties: true + type: object - type: 'null' title: Outputs type: object @@ -13658,9 +13731,15 @@ components: properties: thumbnail_url: type: string + maxLength: 2083 + minLength: 1 + format: uri title: Thumbnail Url file_url: type: string + maxLength: 2083 + minLength: 1 + format: uri title: File Url mimetype: anyOf: @@ -14312,6 +14391,9 @@ components: title: Paymentmethodid paymentMethodFormUrl: type: string + maxLength: 2083 + minLength: 1 + format: uri title: Paymentmethodformurl description: Link to external site that holds the payment submission form type: object @@ -14369,6 +14451,9 @@ components: invoiceUrl: anyOf: - type: string + maxLength: 2083 + minLength: 1 + format: uri - type: 'null' title: Invoiceurl type: object @@ -14517,6 +14602,7 @@ components: type: string title: Country extras: + additionalProperties: true type: object title: Extras description: Keeps extra information provided in the request form. @@ -14548,6 +14634,8 @@ components: properties: link: type: string + minLength: 1 + format: uri title: Link type: object required: @@ -14763,13 +14851,15 @@ components: description: Short display name for SMS vendor: anyOf: - - type: object + - additionalProperties: true + type: object - type: 'null' title: Vendor description: vendor attributes issues: anyOf: - items: + additionalProperties: true type: object type: array - type: 'null' @@ -14778,6 +14868,7 @@ components: manuals: anyOf: - items: + additionalProperties: true type: object type: array - type: 'null' @@ -14786,12 +14877,14 @@ components: support: anyOf: - items: + additionalProperties: true type: object type: array - type: 'null' title: Support description: List of support resources loginSettings: + additionalProperties: true type: object title: Loginsettings maxOpenStudiesPerUser: @@ -14846,6 +14939,7 @@ components: type: string title: Productname ui: + additionalProperties: true type: object title: Ui description: Front-end owned ui product configuration @@ -14983,7 +15077,8 @@ components: application/schema+json: '#/components/schemas/JSONFunctionOutputSchema' defaultInputs: anyOf: - - type: object + - additionalProperties: true + type: object - type: 'null' title: Defaultinputs projectId: @@ -15012,6 +15107,9 @@ components: thumbnail: anyOf: - type: string + maxLength: 2083 + minLength: 1 + format: uri - type: string const: '' title: Thumbnail @@ -15074,6 +15172,7 @@ components: title: Classifiers default: [] quality: + additionalProperties: true type: object title: Quality default: {} @@ -15085,7 +15184,8 @@ components: title: Ui dev: anyOf: - - type: object + - additionalProperties: true + type: object - type: 'null' title: Dev permalink: @@ -15210,6 +15310,9 @@ components: thumbnail: anyOf: - type: string + maxLength: 2083 + minLength: 1 + format: uri - type: string const: '' title: Thumbnail @@ -15272,6 +15375,7 @@ components: title: Classifiers default: [] quality: + additionalProperties: true type: object title: Quality default: {} @@ -15283,7 +15387,8 @@ components: title: Ui dev: anyOf: - - type: object + - additionalProperties: true + type: object - type: 'null' title: Dev permalink: @@ -15380,7 +15485,8 @@ components: title: Kind content_schema: anyOf: - - type: object + - additionalProperties: true + type: object - type: 'null' title: Content Schema description: jsonschema for the port's value. SEE https://json-schema.org/understanding-json-schema/ @@ -15479,7 +15585,8 @@ components: title: Classifiers dev: anyOf: - - type: object + - additionalProperties: true + type: object - type: 'null' title: Dev ui: @@ -15488,7 +15595,8 @@ components: - type: 'null' quality: anyOf: - - type: object + - additionalProperties: true + type: object - type: 'null' title: Quality templateType: @@ -15501,6 +15609,9 @@ components: properties: url: type: string + maxLength: 2083 + minLength: 1 + format: uri title: Url is_public: type: boolean @@ -15556,6 +15667,9 @@ components: title: Shareeemail confirmationLink: type: string + maxLength: 2083 + minLength: 1 + format: uri title: Confirmationlink type: object required: @@ -15801,7 +15915,8 @@ components: application/schema+json: '#/components/schemas/JSONFunctionOutputSchema' defaultInputs: anyOf: - - type: object + - additionalProperties: true + type: object - type: 'null' title: Defaultinputs uid: @@ -15858,7 +15973,8 @@ components: application/schema+json: '#/components/schemas/JSONFunctionOutputSchema' defaultInputs: anyOf: - - type: object + - additionalProperties: true + type: object - type: 'null' title: Defaultinputs uid: @@ -16067,7 +16183,6 @@ components: exclusiveMinimum: true title: Service Port description: the service swarm internal port - default: 8080 maximum: 65535 minimum: 0 published_port: @@ -16105,6 +16220,7 @@ components: - project_id - service_uuid - service_host + - service_port - service_state title: RunningDynamicServiceDetails RunningState: @@ -16173,6 +16289,9 @@ components: description: Long description of the service thumbnail: type: string + maxLength: 2083 + minLength: 1 + format: uri title: Thumbnail description: Url to service thumbnail file_extensions: @@ -16183,6 +16302,9 @@ components: description: File extensions that this service can process view_url: type: string + maxLength: 2083 + minLength: 1 + format: uri title: View Url description: Redirection to open a service in osparc (see /view) type: object @@ -16253,7 +16375,8 @@ components: is allowed contentSchema: anyOf: - - type: object + - additionalProperties: true + type: object - type: 'null' title: Contentschema description: jsonschema of this input/output. Required when type='ref_contentSchema' @@ -16370,7 +16493,8 @@ components: is allowed contentSchema: anyOf: - - type: object + - additionalProperties: true + type: object - type: 'null' title: Contentschema description: jsonschema of this input/output. Required when type='ref_contentSchema' @@ -16723,7 +16847,8 @@ components: application/schema+json: '#/components/schemas/JSONFunctionOutputSchema' defaultInputs: anyOf: - - type: object + - additionalProperties: true + type: object - type: 'null' title: Defaultinputs solverKey: @@ -16889,6 +17014,9 @@ components: icon: anyOf: - type: string + maxLength: 2083 + minLength: 1 + format: uri - type: 'null' title: Icon workbench: @@ -17179,6 +17307,7 @@ components: title: Template Name default: registration_email.jinja2 template_context: + additionalProperties: true type: object title: Template Context default: {} @@ -17426,6 +17555,7 @@ components: - type: 'null' title: Country extras: + additionalProperties: true type: object title: Extras description: Keeps extra information provided in the request form @@ -17707,6 +17837,9 @@ components: description: Identifier for the file type view_url: type: string + maxLength: 2083 + minLength: 1 + format: uri title: View Url description: Base url to execute viewer. Needs appending file_size,[file_name] and download_link as query parameters @@ -17862,6 +17995,9 @@ components: paymentFormUrl: anyOf: - type: string + maxLength: 2083 + minLength: 1 + format: uri - type: 'null' title: Paymentformurl description: Link to external site that holds the payment submission form.None diff --git a/services/web/server/src/simcore_service_webserver/projects/models.py b/services/web/server/src/simcore_service_webserver/projects/models.py index 03d595d741c..e754bde1cf2 100644 --- a/services/web/server/src/simcore_service_webserver/projects/models.py +++ b/services/web/server/src/simcore_service_webserver/projects/models.py @@ -112,7 +112,7 @@ class ProjectPatchInternalExtended(ProjectPatch): trashed_by: UserID | None trashed_explicitly: bool - model_config = ConfigDict(populate_by_name=True, extra="forbid") + model_config = ConfigDict(validate_by_name=True, extra="forbid") def to_domain_model(self) -> dict[str, Any]: return remap_keys( diff --git a/services/web/server/src/simcore_service_webserver/session/settings.py b/services/web/server/src/simcore_service_webserver/session/settings.py index 4e1c99dac68..8ed7aa397c9 100644 --- a/services/web/server/src/simcore_service_webserver/session/settings.py +++ b/services/web/server/src/simcore_service_webserver/session/settings.py @@ -21,9 +21,7 @@ class SessionSettings(BaseCustomSettings, MixinSessionSettings): description="Secret key to encrypt cookies. " 'TIP: python3 -c "from cryptography.fernet import *; print(Fernet.generate_key())"', min_length=44, - validation_alias=AliasChoices( - "SESSION_SECRET_KEY", "WEBSERVER_SESSION_SECRET_KEY" - ), + validation_alias=AliasChoices("WEBSERVER_SESSION_SECRET_KEY"), ), ] diff --git a/tests/e2e-playwright/requirements/_test.txt b/tests/e2e-playwright/requirements/_test.txt index 86bc70ba2c4..cf94941b953 100644 --- a/tests/e2e-playwright/requirements/_test.txt +++ b/tests/e2e-playwright/requirements/_test.txt @@ -70,9 +70,9 @@ pluggy==1.5.0 # via # -r requirements/_test_wo_playwright.txt # pytest -pydantic==2.10.6 +pydantic==2.11.7 # via -r requirements/_test_wo_playwright.txt -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via # -r requirements/_test_wo_playwright.txt # pydantic @@ -147,6 +147,11 @@ typing-extensions==4.14.1 # pydantic # pydantic-core # pyee + # typing-inspection +typing-inspection==0.4.1 + # via + # -r requirements/_test_wo_playwright.txt + # pydantic tzdata==2025.1 # via # -r requirements/_test_wo_playwright.txt diff --git a/tests/e2e-playwright/requirements/_test_wo_playwright.txt b/tests/e2e-playwright/requirements/_test_wo_playwright.txt index 944674aa500..c1b02485018 100644 --- a/tests/e2e-playwright/requirements/_test_wo_playwright.txt +++ b/tests/e2e-playwright/requirements/_test_wo_playwright.txt @@ -43,9 +43,9 @@ packaging==24.2 # pytest-sugar pluggy==1.5.0 # via pytest -pydantic==2.10.6 +pydantic==2.11.7 # via -r requirements/_test_wo_playwright.in -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic pygments==2.19.2 # via pytest @@ -86,6 +86,9 @@ typing-extensions==4.14.1 # anyio # pydantic # pydantic-core + # typing-inspection +typing-inspection==0.4.1 + # via pydantic tzdata==2025.1 # via faker urllib3==2.5.0 diff --git a/tests/environment-setup/requirements/requirements.txt b/tests/environment-setup/requirements/requirements.txt index a30d3146cfa..66ab35d23fb 100644 --- a/tests/environment-setup/requirements/requirements.txt +++ b/tests/environment-setup/requirements/requirements.txt @@ -8,7 +8,7 @@ packaging==24.2 # pytest-sugar pluggy==1.5.0 # via pytest -pydantic==2.10.6 +pydantic==2.11.7 # via # -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 @@ -20,7 +20,7 @@ pydantic==2.10.6 # -c requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../requirements/constraints.txt # -r requirements/requirements.in -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic pygments==2.19.2 # via pytest @@ -56,3 +56,6 @@ typing-extensions==4.14.1 # via # pydantic # pydantic-core + # typing-inspection +typing-inspection==0.4.1 + # via pydantic diff --git a/tests/performance/requirements/_test.txt b/tests/performance/requirements/_test.txt index e1aca12819f..c5bafb89bc9 100644 --- a/tests/performance/requirements/_test.txt +++ b/tests/performance/requirements/_test.txt @@ -67,13 +67,13 @@ psycogreen==1.0.2 # via locust-plugins psycopg2-binary==2.9.10 # via locust-plugins -pydantic==2.11.5 +pydantic==2.11.7 # via # -r requirements/_test.in # pydantic-settings pydantic-core==2.33.2 # via pydantic -pydantic-settings==2.9.1 +pydantic-settings==2.10.1 # via -r requirements/_test.in python-dotenv==1.1.0 # via pydantic-settings diff --git a/tests/public-api/requirements/_base.txt b/tests/public-api/requirements/_base.txt index fe7f9bd8b3d..60bd286eb25 100644 --- a/tests/public-api/requirements/_base.txt +++ b/tests/public-api/requirements/_base.txt @@ -41,7 +41,7 @@ osparc-client==0.8.3 # via osparc packaging==24.2 # via osparc -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/settings-library/requirements/../../../requirements/constraints.txt @@ -50,9 +50,9 @@ pydantic==2.10.6 # osparc # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.2 +pydantic-extra-types==2.10.5 # via -r requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/_base.in pydantic-settings==2.7.0 # via @@ -91,6 +91,9 @@ typing-extensions==4.14.1 # pydantic-core # pydantic-extra-types # typer + # typing-inspection +typing-inspection==0.4.1 + # via pydantic urllib3==2.5.0 # via # -c requirements/../../../packages/settings-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt diff --git a/tests/swarm-deploy/requirements/_test.txt b/tests/swarm-deploy/requirements/_test.txt index 861c49188ad..7888e1a9e90 100644 --- a/tests/swarm-deploy/requirements/_test.txt +++ b/tests/swarm-deploy/requirements/_test.txt @@ -400,7 +400,7 @@ psycopg2-binary==2.9.10 # via sqlalchemy pycryptodome==3.21.0 # via stream-zip -pydantic==2.10.6 +pydantic==2.11.7 # via # -c requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/../../../requirements/constraints.txt # -c requirements/../../../packages/models-library/requirements/../../../requirements/constraints.txt @@ -454,9 +454,9 @@ pydantic==2.10.6 # fast-depends # pydantic-extra-types # pydantic-settings -pydantic-core==2.27.2 +pydantic-core==2.33.2 # via pydantic -pydantic-extra-types==2.10.2 +pydantic-extra-types==2.10.5 # via # -r requirements/../../../packages/models-library/requirements/../../../packages/common-library/requirements/_base.in # -r requirements/../../../packages/models-library/requirements/_base.in @@ -730,6 +730,9 @@ typing-extensions==4.14.1 # pydantic-core # pydantic-extra-types # typer + # typing-inspection +typing-inspection==0.4.1 + # via pydantic tzdata==2025.1 # via faker urllib3==2.5.0