1
1
import dataclasses
2
- from typing import Callable , List , NamedTuple , Optional , TypedDict
2
+ from typing import Any , Callable , List , NamedTuple , Optional , TypedDict
3
3
4
4
import pytest
5
5
@@ -15,6 +15,7 @@ class Model:
15
15
c : float = 0.0
16
16
d : bool = False
17
17
e : List [int ] = dataclasses .field (default_factory = list )
18
+ f : Any = ()
18
19
19
20
return Model
20
21
@@ -26,6 +27,35 @@ class Model(NamedTuple):
26
27
c : float = 0.0
27
28
d : bool = False
28
29
e : List [int ] = [] # noqa
30
+ f : Any = ()
31
+
32
+ return Model
33
+
34
+
35
+ def _pydantic_v1_model_str () -> type :
36
+ from pydantic .v1 import BaseModel , Field
37
+
38
+ class Model (BaseModel ):
39
+ a : "int" = 0
40
+ b : "Optional[str]" = None
41
+ c : "float" = 0.0
42
+ d : "bool" = False
43
+ e : "List[int]" = Field (default_factory = list )
44
+ f : "Any" = ()
45
+
46
+ return Model
47
+
48
+
49
+ def _pydantic_v1_model () -> type :
50
+ from pydantic .v1 import BaseModel , Field
51
+
52
+ class Model (BaseModel ):
53
+ a : int = 0
54
+ b : Optional [str ] = None
55
+ c : float = 0.0
56
+ d : bool = False
57
+ e : List [int ] = Field (default_factory = list )
58
+ f : Any = ()
29
59
30
60
return Model
31
61
@@ -39,6 +69,7 @@ class Model(BaseModel):
39
69
c : float = 0.0
40
70
d : bool = False
41
71
e : List [int ] = Field (default_factory = list )
72
+ f : Any = ()
42
73
43
74
return Model
44
75
@@ -53,6 +84,7 @@ class Model:
53
84
c : float = 0.0
54
85
d : bool = False
55
86
e : List [int ] = dataclasses .field (default_factory = list )
87
+ f : Any = ()
56
88
57
89
return Model
58
90
@@ -67,6 +99,7 @@ class Model(SQLModel):
67
99
c : float = 0.0
68
100
d : bool = False
69
101
e : List [int ] = Field (default_factory = list )
102
+ f : Any = ()
70
103
71
104
return Model
72
105
@@ -81,6 +114,7 @@ class Model:
81
114
c : float = 0.0
82
115
d : bool = False
83
116
e : List [int ] = attr .field (default = attr .Factory (list ))
117
+ f : Any = ()
84
118
85
119
return Model
86
120
@@ -94,6 +128,7 @@ class Model(msgspec.Struct):
94
128
c : float = 0.0
95
129
d : bool = False
96
130
e : List [int ] = msgspec .field (default_factory = list )
131
+ f : Any = ()
97
132
98
133
return Model
99
134
@@ -108,6 +143,7 @@ class Model:
108
143
c : float = 0.0
109
144
d : bool = False
110
145
e : List [int ] = [] # noqa
146
+ f : Any = ()
111
147
112
148
return Model
113
149
@@ -121,6 +157,7 @@ class Model(models.Model):
121
157
c : float = models .FloatField (default = 0.0 )
122
158
d : bool = models .BooleanField (default = False )
123
159
e : List [int ] = models .JSONField (default = list )
160
+ f : Any = ()
124
161
125
162
return Model
126
163
@@ -132,6 +169,8 @@ class Model(models.Model):
132
169
_named_tuple ,
133
170
_dataclassy_model ,
134
171
_pydantic_model ,
172
+ _pydantic_v1_model ,
173
+ _pydantic_v1_model_str ,
135
174
_attrs_model ,
136
175
_msgspec_model ,
137
176
_sqlmodel ,
@@ -142,30 +181,39 @@ class Model(models.Model):
142
181
def test_adapters (builder : Callable ) -> None :
143
182
model = builder ()
144
183
obj = model ()
145
- assert asdict (obj ) == {"a" : 0 , "b" : None , "c" : 0.0 , "d" : False , "e" : []}
146
- assert astuple (obj ) == (0 , None , 0.0 , False , [])
184
+ assert asdict (obj ) == {"a" : 0 , "b" : None , "c" : 0.0 , "d" : False , "e" : [], "f" : () }
185
+ assert astuple (obj ) == (0 , None , 0.0 , False , [], () )
147
186
fields_ = fields (obj )
148
- assert [f .name for f in fields_ ] == ["a" , "b" , "c" , "d" , "e" ]
149
- assert [f .type for f in fields_ ] == [int , Optional [str ], float , bool , List [int ]]
150
- assert [f .frozen for f in fields_ ] == [False ] * 5
187
+ assert [f .name for f in fields_ ] == ["a" , "b" , "c" , "d" , "e" , "f" ]
188
+ assert [f .type for f in fields_ ] == [
189
+ int ,
190
+ Optional [str ],
191
+ float ,
192
+ bool ,
193
+ List [int ],
194
+ Any ,
195
+ ]
196
+ assert [f .frozen for f in fields_ ] == [False ] * 6
151
197
if is_named_tuple (obj ):
152
- assert [f .default for f in fields_ ] == [0 , None , 0.0 , False , []]
198
+ assert [f .default for f in fields_ ] == [0 , None , 0.0 , False , [], () ]
153
199
else :
154
200
# namedtuples don't have default_factory
155
- assert [f .default for f in fields_ ] == [
156
- 0 ,
157
- None ,
158
- 0.0 ,
159
- False ,
160
- Field .MISSING ,
161
- ]
201
+ assert [f .default for f in fields_ ] == [0 , None , 0.0 , False , Field .MISSING , ()]
162
202
assert [f .default_factory for f in fields_ ] == [
163
203
* [Field .MISSING ] * 4 ,
164
204
list ,
205
+ Field .MISSING ,
165
206
]
166
207
167
- obj2 = replace (obj , a = 1 , b = "b2" , c = 1.0 , d = True , e = [1 , 2 , 3 ])
168
- assert asdict (obj2 ) == {"a" : 1 , "b" : "b2" , "c" : 1.0 , "d" : True , "e" : [1 , 2 , 3 ]}
208
+ obj2 = replace (obj , a = 1 , b = "b2" , c = 1.0 , d = True , e = [1 , 2 , 3 ], f = {})
209
+ assert asdict (obj2 ) == {
210
+ "a" : 1 ,
211
+ "b" : "b2" ,
212
+ "c" : 1.0 ,
213
+ "d" : True ,
214
+ "e" : [1 , 2 , 3 ],
215
+ "f" : {},
216
+ }
169
217
170
218
p = params (obj )
171
219
assert p .eq is True
0 commit comments