1+ import datetime
12from typing import Dict
23from typing import List
4+ from math import isnan
35from typing import Optional
46from typing import Union
57
810from pydantic import constr
911from pydantic import Extra
1012from pydantic import StrictInt
11- from pydantic import StrictFloat
13+ from pydantic import StrictFloat as PydanticStrictFloat
1214from pydantic import StrictStr
1315from pydantic import StrictBool
1416from pydantic import Field
@@ -39,6 +41,20 @@ def enum_error_handling(self) -> str:
3941 return f"Invalid value, permitted: { permitted } "
4042
4143
44+ class StrictFloat (PydanticStrictFloat ):
45+
46+ @classmethod
47+ def __get_validators__ (cls ):
48+ yield from super ().__get_validators__ ()
49+ yield cls ._validate_nan
50+
51+ @staticmethod
52+ def _validate_nan (v ):
53+ if isnan (v ):
54+ raise TypeError ("NaN is not a valid float" )
55+ return v
56+
57+
4258EnumMemberError .__str__ = enum_error_handling
4359
4460NotEmptyStr = constr (strict = True , min_length = 1 )
@@ -59,6 +75,7 @@ def validate(cls, value: Union[str]) -> Union[str]:
5975
6076
6177class BaseModel (PyDanticBaseModel ):
78+
6279 class Config :
6380 extra = Extra .allow
6481 use_enum_values = True
@@ -96,14 +113,17 @@ class TimedBaseModel(BaseModel):
96113 created_at : Optional [constr (regex = DATE_REGEX )] = Field (None , alias = "createdAt" )
97114 updated_at : Optional [constr (regex = DATE_REGEX )] = Field (None , alias = "updatedAt" )
98115
99- @validator ("created_at" , "updated_at" , pre = True )
116+ @validator ("created_at" , "updated_at" , pre = True , always = True )
100117 def validate_created_at (cls , value ):
101- try :
102- if value is not None :
103- constr (regex = DATE_REGEX , strict = True ).validate (value )
104- except (TypeError , StrRegexError ):
105- raise TypeError (DATE_TIME_FORMAT_ERROR_MESSAGE )
106- return value
118+ if value :
119+ try :
120+ if value is not None :
121+ constr (regex = DATE_REGEX , strict = True ).validate (value )
122+ except (TypeError , StrRegexError ):
123+ raise TypeError (DATE_TIME_FORMAT_ERROR_MESSAGE )
124+ return value
125+ else :
126+ return datetime .datetime .now ().strftime ("%Y-%m-%dT%H:%M:%S.%f" )[:- 3 ] + "Z"
107127
108128
109129class UserAction (BaseModel ):
0 commit comments