22from typing import Deque , Dict , Generic , List , Optional , TypeVar , Union
33
44import pytest
5- from attr import asdict , attrs , define
5+ from attrs import asdict , define
66
77from cattrs import BaseConverter , Converter
88from cattrs ._compat import Protocol
@@ -132,7 +132,7 @@ def test_able_to_structure_deeply_nested_generics_gen(converter):
132132
133133
134134def test_structure_unions_of_generics (converter ):
135- @attrs ( auto_attribs = True )
135+ @define
136136 class TClass2 (Generic [T ]):
137137 c : T
138138
@@ -142,7 +142,7 @@ class TClass2(Generic[T]):
142142
143143
144144def test_structure_list_of_generic_unions (converter ):
145- @attrs ( auto_attribs = True )
145+ @define
146146 class TClass2 (Generic [T ]):
147147 c : T
148148
@@ -154,7 +154,7 @@ class TClass2(Generic[T]):
154154
155155
156156def test_structure_deque_of_generic_unions (converter ):
157- @attrs ( auto_attribs = True )
157+ @define
158158 class TClass2 (Generic [T ]):
159159 c : T
160160
@@ -179,35 +179,31 @@ def test_raises_if_no_generic_params_supplied(
179179 assert exc .value .type_ is T
180180
181181
182- def test_unstructure_generic_attrs ():
183- c = Converter ()
184-
185- @attrs (auto_attribs = True )
182+ def test_unstructure_generic_attrs (genconverter ):
183+ @define
186184 class Inner (Generic [T ]):
187185 a : T
188186
189- @attrs ( auto_attribs = True )
187+ @define
190188 class Outer :
191189 inner : Inner [int ]
192190
193191 initial = Outer (Inner (1 ))
194- raw = c .unstructure (initial )
192+ raw = genconverter .unstructure (initial )
195193
196194 assert raw == {"inner" : {"a" : 1 }}
197195
198- new = c .structure (raw , Outer )
196+ new = genconverter .structure (raw , Outer )
199197 assert initial == new
200198
201- @attrs ( auto_attribs = True )
199+ @define
202200 class OuterStr :
203201 inner : Inner [str ]
204202
205- assert c .structure (raw , OuterStr ) == OuterStr (Inner ("1" ))
206-
203+ assert genconverter .structure (raw , OuterStr ) == OuterStr (Inner ("1" ))
207204
208- def test_unstructure_deeply_nested_generics ():
209- c = Converter ()
210205
206+ def test_unstructure_deeply_nested_generics (genconverter ):
211207 @define
212208 class Inner :
213209 a : int
@@ -217,16 +213,14 @@ class Outer(Generic[T]):
217213 inner : T
218214
219215 initial = Outer [Inner ](Inner (1 ))
220- raw = c .unstructure (initial , Outer [Inner ])
216+ raw = genconverter .unstructure (initial , Outer [Inner ])
221217 assert raw == {"inner" : {"a" : 1 }}
222218
223- raw = c .unstructure (initial )
219+ raw = genconverter .unstructure (initial )
224220 assert raw == {"inner" : {"a" : 1 }}
225221
226222
227- def test_unstructure_deeply_nested_generics_list ():
228- c = Converter ()
229-
223+ def test_unstructure_deeply_nested_generics_list (genconverter ):
230224 @define
231225 class Inner :
232226 a : int
@@ -236,16 +230,14 @@ class Outer(Generic[T]):
236230 inner : List [T ]
237231
238232 initial = Outer [Inner ]([Inner (1 )])
239- raw = c .unstructure (initial , Outer [Inner ])
233+ raw = genconverter .unstructure (initial , Outer [Inner ])
240234 assert raw == {"inner" : [{"a" : 1 }]}
241235
242- raw = c .unstructure (initial )
236+ raw = genconverter .unstructure (initial )
243237 assert raw == {"inner" : [{"a" : 1 }]}
244238
245239
246- def test_unstructure_protocol ():
247- c = Converter ()
248-
240+ def test_unstructure_protocol (genconverter ):
249241 class Proto (Protocol ):
250242 a : int
251243
@@ -258,10 +250,10 @@ class Outer:
258250 inner : Proto
259251
260252 initial = Outer (Inner (1 ))
261- raw = c .unstructure (initial , Outer )
253+ raw = genconverter .unstructure (initial , Outer )
262254 assert raw == {"inner" : {"a" : 1 }}
263255
264- raw = c .unstructure (initial )
256+ raw = genconverter .unstructure (initial )
265257 assert raw == {"inner" : {"a" : 1 }}
266258
267259
@@ -306,3 +298,27 @@ class B(A[int]):
306298 pass
307299
308300 assert generate_mapping (B , {}) == {T .__name__ : int }
301+
302+
303+ def test_nongeneric_protocols (converter ):
304+ """Non-generic protocols work."""
305+
306+ class NongenericProtocol (Protocol ):
307+ ...
308+
309+ @define
310+ class Entity (NongenericProtocol ):
311+ ...
312+
313+ assert generate_mapping (Entity ) == {}
314+
315+ class GenericProtocol (Protocol [T ]):
316+ ...
317+
318+ @define
319+ class GenericEntity (GenericProtocol [int ]):
320+ a : int
321+
322+ assert generate_mapping (GenericEntity ) == {"T" : int }
323+
324+ assert converter .structure ({"a" : 1 }, GenericEntity ) == GenericEntity (1 )
0 commit comments