8000 Added support for resolver tagging. Fixed #6 · graphql-python/graphene@40b88bc · GitHub
[go: up one dir, main page]

Skip to content

Commit 40b88bc

Browse files
committed
Added support for resolver tagging. Fixed #6
1 parent 739856a commit 40b88bc

File tree

3 files changed

+40
-14
lines changed

3 files changed

+40
-14
lines changed

graphene/core/fields.py

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import inspect
22
import six
3-
from functools import total_ordering
3+
from functools import total_ordering, wraps
44
from graphql.core.type import (
55
GraphQLField,
66
GraphQLList,
@@ -49,12 +49,26 @@ def contribute_to_class(self, cls, name):
4949
cls._meta.add_field(self)
5050

5151
def resolve(self, instance, args, info):
52+
resolve_fn = self.get_resolve_fn()
53+
if resolve_fn:
54+
return resolve_fn(instance, args, info)
55+
else:
56+
return instance.get_field(self.field_name)
57+
58+
@memoize
59+
def get_resolve_fn(self):
5260
if self.resolve_fn:
53-
resolve_fn = self.resolve_fn
61+
return self.resolve_fn
5462
else:
55-
resolve_fn = lambda root, args, info: root.resolve(
56-
self.field_name, args, info)
57-
return resolve_fn(instance, args, info)
63+
custom_resolve_fn_name = 'resolve_%s' % self.field_name
64+
if hasattr(self.object_type, custom_resolve_fn_name):
65+
resolve_fn = getattr(self.object_type, custom_resolve_fn_name)
66+
67+
@wraps(resolve_fn)
68+
def custom_resolve_fn(instance, args, info):
69+
custom_fn = getattr(instance, custom_resolve_fn_name)
70+
return custom_fn(args, info)
71+
return custom_resolve_fn
5872

5973
def get_object_type(self, schema):
6074
field_type = self.field_type
@@ -110,11 +124,18 @@ def internal_field(self, schema):
110124
if not internal_type:
111125
raise Exception("Internal type for field %s is None" % self)
112126

127+
resolve_fn = self.get_resolve_fn()
128+
if resolve_fn:
129+
@wraps(resolve_fn)
130+
def resolver(*args):
131+
return self.resolve(*args)
132+
else:
133+
resolver = self.resolve
113134
return GraphQLField(
114135
internal_type,
115136
description=self.description,
116137
args=self.args,
117-
resolver=self.resolve,
138+
resolver=resolver,
118139
)
119140

120141
def __str__(self):
@@ -144,7 +165,7 @@ def __lt__(self, other):
144165
return NotImplemented
145166

146167
def __hash__(self):
147-
return hash(self.creation_counter)
168+
return hash((self.creation_counter, self.object_type))
148169

149170
def __copy__(self):
150171
# We need to avoid hitting __reduce__, so define this

graphene/core/types.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -132,13 +132,6 @@ def __getattr__(self, name):
132132
def get_field(self, field):
133133
return getattr(self.instance, field, None)
134134

135-
def resolve(self, field_name, args, info):
136-
custom_resolve_fn = 'resolve_%s' % field_name
137-
if hasattr(self, custom_resolve_fn):
138-
resolve_fn = getattr(self, custom_resolve_fn)
139-
return resolve_fn(args, info)
140-
return self.get_field(field_name)
141-
142135
@classmethod
143136
def resolve_type(cls, schema, instance, *_):
144137
return instance.internal_type(schema)

tests/core/test_types.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,15 @@ def test_field_clashes():
6969
class Droid(Character):
7070
name = IntField()
7171
assert 'clashes' in str(excinfo.value)
72+
73+
74+
def test_field_mantain_resolver_tags():
75+
class Droid(Character):
76+
name = StringField()
77+
78+
def resolve_name(self, *args):
79+
return 'My Droid'
80+
resolve_name.custom_tag = True
81+
82+
field = Droid._meta.fields_map['name'].internal_field(schema)
83+
assert field.resolver.custom_tag

0 commit comments

Comments
 (0)
0