1
1
from __future__ import annotations
2
2
from typing import get_origin , Generic , TypeVar , Optional , Iterable
3
3
4
- from pydantic import WrapSerializer , WrapValidator
4
+ from pydantic import BeforeValidator , WrapSerializer , WrapValidator
5
5
from typing_extensions import Self
6
6
import re
7
7
20
20
_user_variables : set [str ] = set ()
21
21
22
22
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
-
30
23
def _is_number_string (s : str ) -> bool :
31
24
try :
32
25
float (s )
@@ -208,9 +201,9 @@ class Expression(Flow360BaseModel):
208
201
209
202
model_config = pd .ConfigDict (validate_assignment = True )
210
203
211
- @pd .model_validator (mode = "wrap " )
204
+ @pd .model_validator (mode = "before " )
212
205
@classmethod
213
- def _validate_expression (cls , value , handler ) -> Self :
206
+ def _validate_expression (cls , value ) -> Self :
214
207
if isinstance (value , str ):
215
208
expression = value
216
209
elif isinstance (value , dict ) and "expression" in value .keys ():
@@ -234,7 +227,7 @@ def _validate_expression(cls, value, handler) -> Self:
234
227
details = InitErrorDetails (type = "value_error" , ctx = {"error" : v_err })
235
228
raise pd .ValidationError .from_exception_data ("expression value error" , [details ])
236
229
237
- return handler ( {"expression" : expression })
230
+ return {"expression" : expression }
238
231
239
232
def evaluate (self , strict = True ) -> float :
240
233
expr = expression_to_model (self .expression , _global_ctx )
@@ -350,22 +343,22 @@ def _internal_validator(value: Expression):
350
343
351
344
expr_type = Annotated [Expression , pd .AfterValidator (_internal_validator )]
352
345
353
- def _deserialize (value , handler ) -> Self :
346
+ def _deserialize (value ) -> Self :
354
347
try :
355
348
value = SerializedValueOrExpression .model_validate (value , strict = True )
356
349
if value .type_name == "number" :
357
350
if value .units is not None :
358
- return handler ( unyt_quantity (value .value , value .units ) )
351
+ return unyt_quantity (value .value , value .units )
359
352
else :
360
- return handler ( value .value )
353
+ return value .value
361
354
elif value .type_name == "expression" :
362
- return handler ( value .expression )
355
+ return expr_type ( expression = value .expression )
363
356
except Exception as err :
364
357
pass
365
358
366
- return handler ( value )
359
+ return value
367
360
368
- def _serializer (value , handler , info ) -> dict :
361
+ def _serializer (value , info ) -> dict :
369
362
if isinstance (value , Expression ):
370
363
serialized = SerializedValueOrExpression (typeName = "expression" )
371
364
@@ -397,5 +390,9 @@ def _serializer(value, handler, info) -> dict:
397
390
serialized .units = str (value .units .expr )
398
391
399
392
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 )]
400
397
401
- return Annotated [ Annotated [ Union [ expr_type , internal_type ], WrapSerializer ( _serializer )], WrapValidator ( _deserialize )]
398
+ return union_type
0 commit comments