Skip to content

Commit 8957d68

Browse files
authored
fix: correct dataclass transform ordering metadata (#4591)
1 parent c3caabd commit 8957d68

8 files changed

Lines changed: 237 additions & 19 deletions

File tree

RELEASE.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
release type: patch
3+
social_messages:
4+
x: >-
5+
{project_name} {version} is out! This release fixes dataclass transform
6+
metadata so custom ordering methods are correctly accepted by type checkers. 🍓
7+
https://strawberry.rocks/release/{version}
8+
linkedin: >-
9+
{project_name} {version} is out. This release fixes dataclass transform
10+
metadata so custom ordering methods are correctly accepted by type checkers.
11+
---
12+
13+
This release fixes incorrect dataclass transform ordering metadata.
14+
15+
Strawberry decorators now correctly declare that ordering methods are not generated
16+
by default, matching their runtime dataclass behavior and allowing custom ordering
17+
methods such as `__gt__` to be used without type-checking errors.

strawberry/federation/object_type.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def _impl_type(
5858

5959
@overload
6060
@dataclass_transform(
61-
order_default=True,
61+
order_default=False,
6262
kw_only_default=True,
6363
field_specifiers=(base_field, field, StrawberryField),
6464
)
@@ -74,7 +74,7 @@ def type(
7474

7575
@overload
7676
@dataclass_transform(
77-
order_default=True,
77+
order_default=False,
7878
kw_only_default=True,
7979
field_specifiers=(base_field, field, StrawberryField),
8080
)
@@ -106,7 +106,7 @@ def type(
106106

107107
@overload
108108
@dataclass_transform(
109-
order_default=True,
109+
order_default=False,
110110
kw_only_default=True,
111111
field_specifiers=(base_field, field, StrawberryField),
112112
)
@@ -124,7 +124,7 @@ def input(
124124

125125
@overload
126126
@dataclass_transform(
127-
order_default=True,
127+
order_default=False,
128128
kw_only_default=True,
129129
field_specifiers=(base_field, field, StrawberryField),
130130
)
@@ -163,7 +163,7 @@ def input(
163163

164164
@overload
165165
@dataclass_transform(
166-
order_default=True,
166+
order_default=False,
167167
kw_only_default=True,
168168
field_specifiers=(base_field, field, StrawberryField),
169169
)
@@ -179,7 +179,7 @@ def interface(
179179

180180
@overload
181181
@dataclass_transform(
182-
order_default=True,
182+
order_default=False,
183183
kw_only_default=True,
184184
field_specifiers=(base_field, field, StrawberryField),
185185
)
@@ -212,7 +212,7 @@ def interface(
212212

213213
@overload
214214
@dataclass_transform(
215-
order_default=True,
215+
order_default=False,
216216
kw_only_default=True,
217217
field_specifiers=(base_field, field, StrawberryField),
218218
)
@@ -228,7 +228,7 @@ def interface_object(
228228

229229
@overload
230230
@dataclass_transform(
231-
order_default=True,
231+
order_default=False,
232232
kw_only_default=True,
233233
field_specifiers=(base_field, field, StrawberryField),
234234
)

strawberry/federation/schema_directive.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class StrawberryFederationSchemaDirective(StrawberrySchemaDirective):
2424

2525

2626
@dataclass_transform(
27-
order_default=True,
27+
order_default=False,
2828
kw_only_default=True,
2929
field_specifiers=(directive_field, field, StrawberryField),
3030
)

strawberry/schema_directive.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class StrawberrySchemaDirective:
4141

4242

4343
@dataclass_transform(
44-
order_default=True,
44+
order_default=False,
4545
kw_only_default=True,
4646
field_specifiers=(directive_field, field, StrawberryField),
4747
)

strawberry/types/object_type.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ def _process_type(
319319

320320
@overload
321321
@dataclass_transform(
322-
order_default=True, kw_only_default=True, field_specifiers=(field, StrawberryField)
322+
order_default=False, kw_only_default=True, field_specifiers=(field, StrawberryField)
323323
)
324324
def type(
325325
cls: T,
@@ -335,7 +335,7 @@ def type(
335335

336336
@overload
337337
@dataclass_transform(
338-
order_default=True, kw_only_default=True, field_specifiers=(field, StrawberryField)
338+
order_default=False, kw_only_default=True, field_specifiers=(field, StrawberryField)
339339
)
340340
def type(
341341
*,
@@ -349,7 +349,7 @@ def type(
349349

350350

351351
@dataclass_transform(
352-
order_default=True, kw_only_default=True, field_specifiers=(field, StrawberryField)
352+
order_default=False, kw_only_default=True, field_specifiers=(field, StrawberryField)
353353
)
354354
def type(
355355
cls: T | None = None,
@@ -444,7 +444,7 @@ def wrap(cls: T) -> T:
444444

445445
@overload
446446
@dataclass_transform(
447-
order_default=True, kw_only_default=True, field_specifiers=(field, StrawberryField)
447+
order_default=False, kw_only_default=True, field_specifiers=(field, StrawberryField)
448448
)
449449
def input(
450450
cls: T,
@@ -458,7 +458,7 @@ def input(
458458

459459
@overload
460460
@dataclass_transform(
461-
order_default=True, kw_only_default=True, field_specifiers=(field, StrawberryField)
461+
order_default=False, kw_only_default=True, field_specifiers=(field, StrawberryField)
462462
)
463463
def input(
464464
*,
@@ -470,7 +470,7 @@ def input(
470470

471471

472472
@dataclass_transform(
473-
order_default=True, kw_only_default=True, field_specifiers=(field, StrawberryField)
473+
order_default=False, kw_only_default=True, field_specifiers=(field, StrawberryField)
474474
)
475475
def input(
476476
cls: T | None = None,
@@ -526,7 +526,7 @@ class MyUserInput:
526526

527527
@overload
528528
@dataclass_transform(
529-
order_default=True, kw_only_default=True, field_specifiers=(field, StrawberryField)
529+
order_default=False, kw_only_default=True, field_specifiers=(field, StrawberryField)
530530
)
531531
def interface(
532532
cls: T,
@@ -539,7 +539,7 @@ def interface(
539539

540540
@overload
541541
@dataclass_transform(
542-
order_default=True, kw_only_default=True, field_specifiers=(field, StrawberryField)
542+
order_default=False, kw_only_default=True, field_specifiers=(field, StrawberryField)
543543
)
544544
def interface(
545545
*,
@@ -550,7 +550,7 @@ def interface(
550550

551551

552552
@dataclass_transform(
553-
order_default=True, kw_only_default=True, field_specifiers=(field, StrawberryField)
553+
order_default=False, kw_only_default=True, field_specifiers=(field, StrawberryField)
554554
)
555555
def interface(
556556
cls: T | None = None,

tests/typecheckers/test_directives.py

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,104 @@ def test():
5858
),
5959
]
6060
)
61+
62+
63+
def test_schema_directive_custom_ordering_method():
64+
code = """
65+
from strawberry.schema_directive import Location, schema_directive
66+
67+
68+
@schema_directive(locations=[Location.OBJECT])
69+
class UserDirective:
70+
name: str
71+
72+
def __gt__(self, other: "UserDirective") -> bool:
73+
return self.name > other.name
74+
75+
76+
reveal_type(UserDirective)
77+
"""
78+
79+
results = typecheck(code)
80+
81+
assert results.pyright == snapshot(
82+
[
83+
Result(
84+
type="information",
85+
message='Type of "UserDirective" is "type[UserDirective]"',
86+
line=13,
87+
column=13,
88+
)
89+
]
90+
)
91+
assert results.mypy == snapshot(
92+
[
93+
Result(
94+
type="note",
95+
message='Revealed type is "def (*, name: str) -> mypy_test.UserDirective"',
96+
line=13,
97+
column=13,
98+
)
99+
]
100+
)
101+
assert results.ty == snapshot(
102+
[
103+
Result(
104+
type="information",
105+
message="Revealed type: `<class 'UserDirective'>`",
106+
line=13,
107+
column=13,
108+
)
109+
]
110+
)
111+
112+
113+
def test_federation_schema_directive_custom_ordering_method():
114+
code = """
115+
from strawberry.federation.schema_directive import schema_directive
116+
from strawberry.schema_directive import Location
117+
118+
119+
@schema_directive(locations=[Location.OBJECT])
120+
class UserDirective:
121+
name: str
122+
123+
def __gt__(self, other: "UserDirective") -> bool:
124+
return self.name > other.name
125+
126+
127+
reveal_type(UserDirective)
128+
"""
129+
130+
results = typecheck(code)
131+
132+
assert results.pyright == snapshot(
133+
[
134+
Result(
135+
type="information",
136+
message='Type of "UserDirective" is "type[UserDirective]"',
137+
line=14,
138+
column=13,
139+
)
140+
]
141+
)
142+
assert results.mypy == snapshot(
143+
[
144+
Result(
145+
type="note",
146+
message='Revealed type is "def (*, name: str) -> mypy_test.UserDirective"',
147+
line=14,
148+
column=13,
149+
)
150+
]
151+
)
152+
assert results.ty == snapshot(
153+
[
154+
Result(
155+
type="information",
156+
message="Revealed type: `<class 'UserDirective'>`",
157+
line=14,
158+
column=13,
159+
)
160+
]
161+
)

tests/typecheckers/test_federation.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,3 +352,53 @@ def test_federation_scalar():
352352
)
353353
]
354354
)
355+
356+
357+
def test_federation_custom_ordering_method():
358+
code = """
359+
import strawberry
360+
361+
362+
@strawberry.federation.type
363+
class User:
364+
name: str
365+
366+
def __gt__(self, other: "User") -> bool:
367+
return self.name > other.name
368+
369+
370+
reveal_type(User)
371+
"""
372+
373+
results = typecheck(code)
374+
375+
assert results.pyright == snapshot(
376+
[
377+
Result(
378+
type="information",
379+
message='Type of "User" is "type[User]"',
380+
line=13,
381+
column=13,
382+
)
383+
]
384+
)
385+
assert results.mypy == snapshot(
386+
[
387+
Result(
388+
type="note",
389+
message='Revealed type is "def (*, name: str) -> mypy_test.User"',
390+
line=13,
391+
column=13,
392+
)
393+
]
394+
)
395+
assert results.ty == snapshot(
396+
[
397+
Result(
398+
type="information",
399+
message="Revealed type: `<class 'User'>`",
400+
line=13,
401+
column=13,
402+
)
403+
]
404+
)

0 commit comments

Comments
 (0)