Skip to content

Commit 07101f6

Browse files
committed
refact: converter.py resolver code using get_field_resolver
1 parent f29063d commit 07101f6

File tree

2 files changed

+76
-55
lines changed

2 files changed

+76
-55
lines changed

graphene_mongo/converter.py

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
get_query_fields,
1414
get_queried_union_types,
1515
get_field_is_required,
16+
get_field_resolver,
1617
ExecutorEnum,
1718
sync_to_async,
1819
)
@@ -521,12 +522,11 @@ async def lazy_reference_resolver_async(root, *args, **kwargs):
521522
field_resolver = resolver_function
522523
return graphene.Field(
523524
_union,
524-
resolver=field_resolver
525-
if field_resolver
526-
else (
527-
lazy_reference_resolver
528-
if executor == ExecutorEnum.SYNC
529-
else lazy_reference_resolver_async
525+
resolver=get_field_resolver(
526+
field_resolver=field_resolver,
527+
default_sync_resolver=lazy_reference_resolver,
528+
default_async_resolver=lazy_reference_resolver_async,
529+
executor=executor,
530530
),
531531
description=get_field_description(field, registry),
532532
required=required,
@@ -546,10 +546,11 @@ async def lazy_reference_resolver_async(root, *args, **kwargs):
546546
field_resolver = resolver_function
547547
return graphene.Field(
548548
_union,
549-
resolver=field_resolver
550-
if field_resolver
551-
else (
552-
reference_resolver if executor == ExecutorEnum.SYNC else reference_resolver_async
549+
resolver=get_field_resolver(
550+
field_resolver=field_resolver,
551+
default_sync_resolver=reference_resolver,
552+
default_async_resolver=reference_resolver_async,
553+
executor=executor,
553554
),
554555
description=get_field_description(field, registry),
555556
required=required,
@@ -694,25 +695,23 @@ def dynamic_type():
694695
if isinstance(field, mongoengine.ReferenceField):
695696
return graphene.Field(
696697
_type,
697-
resolver=field_resolver
698-
if field_resolver
699-
else (
700-
reference_resolver
701-
if executor == ExecutorEnum.SYNC
702-
else reference_resolver_async
698+
resolver=get_field_resolver(
699+
field_resolver=field_resolver,
700+
default_sync_resolver=reference_resolver,
701+
default_async_resolver=reference_resolver_async,
702+
executor=executor,
703703
),
704704
description=get_field_description(field, registry),
705705
required=required,
706706
)
707707
else:
708708
return graphene.Field(
709709
_type,
710-
resolver=field_resolver
711-
if field_resolver
712-
else (
713-
cached_reference_resolver
714-
if executor == ExecutorEnum.SYNC
715-
else cached_reference_resolver_async
710+
resolver=get_field_resolver(
711+
field_resolver=field_resolver,
712+
default_sync_resolver=cached_reference_resolver,
713+
default_async_resolver=cached_reference_resolver_async,
714+
executor=executor,
716715
),
717716
description=get_field_description(field, registry),
718717
required=required,
@@ -790,9 +789,12 @@ def dynamic_type():
790789
field_resolver = resolver_function
791790
return graphene.Field(
792791
_type,
793-
resolver=field_resolver
794-
if field_resolver
795-
else (lazy_resolver if executor == ExecutorEnum.SYNC else lazy_resolver_async),
792+
resolver=get_field_resolver(
793+
field_resolver=field_resolver,
794+
default_sync_resolver=lazy_resolver,
795+
default_async_resolver=lazy_resolver_async,
796+
executor=executor,
797+
),
796798
description=get_field_description(field, registry),
797799
required=required,
798800
)

graphene_mongo/utils.py

Lines changed: 49 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
from __future__ import unicode_literals
22

3-
import enum
4-
import inspect
53
from collections import OrderedDict
64
from concurrent.futures import ThreadPoolExecutor
5+
import enum
6+
import inspect
77
from typing import Any, Callable, Union
88

9-
import mongoengine
109
from asgiref.sync import SyncToAsync
1110
from asgiref.sync import sync_to_async as asgiref_sync_to_async
1211
from graphene import Node
@@ -19,6 +18,7 @@
1918
VariableNode,
2019
)
2120
from graphql_relay.connection.array_connection import offset_to_cursor
21+
import mongoengine
2222

2323

2424
class ExecutorEnum(enum.Enum):
@@ -163,19 +163,15 @@ def collect_query_fields(node, fragments, variables):
163163
for leaf in selection_set.selections:
164164
if leaf.kind == "field":
165165
if include_field_by_directives(leaf, variables):
166-
field.update(
167-
{leaf.name.value: collect_query_fields(leaf, fragments, variables)}
168-
)
166+
field.update({
167+
leaf.name.value: collect_query_fields(leaf, fragments, variables)
168+
})
169169
elif leaf.kind == "fragment_spread":
170170
field.update(collect_query_fields(fragments[leaf.name.value], fragments, variables))
171171
elif leaf.kind == "inline_fragment":
172-
field.update(
173-
{
174-
leaf.type_condition.name.value: collect_query_fields(
175-
leaf, fragments, variables
176-
)
177-
}
178-
)
172+
field.update({
173+
leaf.type_condition.name.value: collect_query_fields(leaf, fragments, variables)
174+
})
179175

180176
return field
181177

@@ -227,26 +223,22 @@ def collect_query_fields_for_union(node, fragments, variables):
227223
for leaf in selection_set.selections:
228224
if leaf.kind == "field":
229225
if include_field_by_directives(leaf, variables):
230-
field.update(
231-
{leaf.name.value: collect_query_fields(leaf, fragments, variables)}
232-
)
226+
field.update({
227+
leaf.name.value: collect_query_fields(leaf, fragments, variables)
228+
})
233229
elif leaf.kind == "fragment_spread": # This is different
234230
fragment = fragments[leaf.name.value]
235-
field.update(
236-
{
237-
fragment.type_condition.name.value: collect_query_fields(
238-
fragment, fragments, variables
239-
)
240-
}
241-
)
231+
field.update({
232+
fragment.type_condition.name.value: collect_query_fields(
233+
fragment, fragments, variables
234+
)
235+
})
242236
elif leaf.kind == "inline_fragment":
243-
field.update(
244-
{
245-
leaf.type_condition.name.value: collect_query_fields(
246-
leaf, fragments, variables
247-
)
248-
}
249-
)
237+
field.update({
238+
leaf.type_condition.name.value: collect_query_fields(
239+
leaf, fragments, variables
240+
)
241+
})
250242

251243
return field
252244

@@ -421,3 +413,30 @@ def sync_to_async(
421413
if executor is None:
422414
executor = ThreadPoolExecutor()
423415
return asgiref_sync_to_async(func=func, thread_sensitive=thread_sensitive, executor=executor)
416+
417+
418+
def get_field_resolver(
419+
field_resolver: Callable | None,
420+
default_async_resolver: Callable,
421+
default_sync_resolver: Callable,
422+
executor: ExecutorEnum,
423+
) -> Callable:
424+
"""
425+
Helpr function to get the resolver for a field
426+
427+
Args:
428+
field_resolver: user defined resolver (optional)
429+
default_async_resolver: default library async resolver
430+
default_sync_resolver: default library sync resolver
431+
executor: ExecutorEnum
432+
433+
Returns:
434+
resolver: Callable
435+
"""
436+
if field_resolver is not None:
437+
return field_resolver
438+
439+
if executor == ExecutorEnum.ASYNC:
440+
return default_async_resolver
441+
442+
return default_sync_resolver

0 commit comments

Comments
 (0)