Skip to content

Commit ea7ccc3

Browse files
shrouxmerikwrede
andauthored
feat(relay): add option for strict connection types (#1504)
* types: add option for strict connection types * chore: appease linter * chore: appease linter * test: add test --------- Co-authored-by: Erik Wrede <[email protected]>
1 parent 6b8cd2d commit ea7ccc3

File tree

2 files changed

+30
-5
lines changed

2 files changed

+30
-5
lines changed

graphene/relay/connection.py

+13-5
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,18 @@
1313

1414

1515
def get_edge_class(
16-
connection_class: Type["Connection"], _node: Type[AbstractNode], base_name: str
16+
connection_class: Type["Connection"],
17+
_node: Type[AbstractNode],
18+
base_name: str,
19+
strict_types: bool = False,
1720
):
1821
edge_class = getattr(connection_class, "Edge", None)
1922

2023
class EdgeBase:
21-
node = Field(_node, description="The item at the end of the edge")
24+
node = Field(
25+
NonNull(_node) if strict_types else _node,
26+
description="The item at the end of the edge",
27+
)
2228
cursor = String(required=True, description="A cursor for use in pagination")
2329

2430
class EdgeMeta:
@@ -83,7 +89,9 @@ class Meta:
8389
abstract = True
8490

8591
@classmethod
86-
def __init_subclass_with_meta__(cls, node=None, name=None, _meta=None, **options):
92+
def __init_subclass_with_meta__(
93+
cls, node=None, name=None, strict_types=False, _meta=None, **options
94+
):
8795
if not _meta:
8896
_meta = ConnectionOptions(cls)
8997
assert node, f"You have to provide a node in {cls.__name__}.Meta"
@@ -111,10 +119,10 @@ def __init_subclass_with_meta__(cls, node=None, name=None, _meta=None, **options
111119
)
112120

113121
if "edges" not in _meta.fields:
114-
edge_class = get_edge_class(cls, node, base_name) # type: ignore
122+
edge_class = get_edge_class(cls, node, base_name, strict_types) # type: ignore
115123
cls.Edge = edge_class
116124
_meta.fields["edges"] = Field(
117-
NonNull(List(edge_class)),
125+
NonNull(List(NonNull(edge_class) if strict_types else edge_class)),
118126
description="Contains the nodes in this connection.",
119127
)
120128

graphene/relay/tests/test_connection.py

+17
Original file line numberDiff line numberDiff line change
@@ -299,3 +299,20 @@ def resolve_test_connection(root, info, **args):
299299
executed = schema.execute("{ testConnection { edges { cursor } } }")
300300
assert not executed.errors
301301
assert executed.data == {"testConnection": {"edges": []}}
302+
303+
304+
def test_connectionfield_strict_types():
305+
class MyObjectConnection(Connection):
306+
class Meta:
307+
node = MyObject
308+
strict_types = True
309+
310+
connection_field = ConnectionField(MyObjectConnection)
311+
edges_field_type = connection_field.type._meta.fields["edges"].type
312+
assert isinstance(edges_field_type, NonNull)
313+
314+
edges_list_element_type = edges_field_type.of_type.of_type
315+
assert isinstance(edges_list_element_type, NonNull)
316+
317+
node_field = edges_list_element_type.of_type._meta.fields["node"]
318+
assert isinstance(node_field.type, NonNull)

0 commit comments

Comments
 (0)