Skip to content

Commit 49318b0

Browse files
Andrzej KrupkaAndrzej Krupka
Andrzej Krupka
authored and
Andrzej Krupka
committed
Fix validation ordering bug
1 parent eedb1a7 commit 49318b0

File tree

3 files changed

+17
-20
lines changed

3 files changed

+17
-20
lines changed

flow360/component/simulation/blueprint/core/resolver.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def get_allowed_callable(self, qualname: str) -> Callable[..., Any]:
9999
or qualname in self._module_builtins
100100
or any(
101101
qualname.startswith(f"{group['prefix']}{name}")
102-
for group in self._callable_builtins.values()
102+
for group in self._callable_builtins.values() if group is not None
103103
for name in group["callables"]
104104
)
105105
):

flow360/component/simulation/primitives.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class ReferenceGeometry(Flow360BaseModel):
8888
moment_length: Optional[Union[LengthType.Positive, LengthType.PositiveVector]] = pd.Field(
8989
None, description="The x, y, z component-wise moment reference lengths."
9090
)
91-
area: Optional[ValueOrExpression[AreaType.Positive]] = pd.Field(
91+
area: Optional[ValueOrExpression[AreaType]] = pd.Field(
9292
None, description="The reference area of the geometry."
9393
)
9494

flow360/component/simulation/user_code.py

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import annotations
22
from typing import get_origin, Generic, TypeVar, Optional, Iterable
33

4-
from pydantic import WrapSerializer, WrapValidator
4+
from pydantic import BeforeValidator, WrapSerializer, WrapValidator
55
from typing_extensions import Self
66
import re
77

@@ -20,13 +20,6 @@
2020
_user_variables: set[str] = set()
2121

2222

23-
def _is_descendant_of(t, base):
24-
if t is None:
25-
return False
26-
origin = get_origin(t) or t
27-
return issubclass(origin, base)
28-
29-
3023
def _is_number_string(s: str) -> bool:
3124
try:
3225
float(s)
@@ -208,9 +201,9 @@ class Expression(Flow360BaseModel):
208201

209202
model_config = pd.ConfigDict(validate_assignment=True)
210203

211-
@pd.model_validator(mode="wrap")
204+
@pd.model_validator(mode="before")
212205
@classmethod
213-
def _validate_expression(cls, value, handler) -> Self:
206+
def _validate_expression(cls, value) -> Self:
214207
if isinstance(value, str):
215208
expression = value
216209
elif isinstance(value, dict) and "expression" in value.keys():
@@ -234,7 +227,7 @@ def _validate_expression(cls, value, handler) -> Self:
234227
details = InitErrorDetails(type="value_error", ctx={"error": v_err})
235228
raise pd.ValidationError.from_exception_data("expression value error", [details])
236229

237-
return handler({"expression": expression})
230+
return {"expression": expression}
238231

239232
def evaluate(self, strict=True) -> float:
240233
expr = expression_to_model(self.expression, _global_ctx)
@@ -350,22 +343,22 @@ def _internal_validator(value: Expression):
350343

351344
expr_type = Annotated[Expression, pd.AfterValidator(_internal_validator)]
352345

353-
def _deserialize(value, handler) -> Self:
346+
def _deserialize(value) -> Self:
354347
try:
355348
value = SerializedValueOrExpression.model_validate(value, strict=True)
356349
if value.type_name == "number":
357350
if value.units is not None:
358-
return handler(unyt_quantity(value.value, value.units))
351+
return unyt_quantity(value.value, value.units)
359352
else:
360-
return handler(value.value)
353+
return value.value
361354
elif value.type_name == "expression":
362-
return handler(value.expression)
355+
return expr_type(expression=value.expression)
363356
except Exception as err:
364357
pass
365358

366-
return handler(value)
359+
return value
367360

368-
def _serializer(value, handler, info) -> dict:
361+
def _serializer(value, info) -> dict:
369362
if isinstance(value, Expression):
370363
serialized = SerializedValueOrExpression(typeName="expression")
371364

@@ -397,5 +390,9 @@ def _serializer(value, handler, info) -> dict:
397390
serialized.units = str(value.units.expr)
398391

399392
return serialized.model_dump(**info.__dict__)
393+
394+
union_type = Union[expr_type, internal_type]
395+
union_type = Annotated[union_type, PlainSerializer(_serializer)]
396+
union_type = Annotated[union_type, BeforeValidator(_deserialize)]
400397

401-
return Annotated[Annotated[Union[expr_type, internal_type], WrapSerializer(_serializer)], WrapValidator(_deserialize)]
398+
return union_type

0 commit comments

Comments
 (0)