Skip to content

Commit 9bab0d9

Browse files
committed
Improved fields resolver
1 parent afe8614 commit 9bab0d9

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

graphene/core/ntypes/field.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from collections import OrderedDict
2+
from functools import wraps
23

34
from graphql.core.type import GraphQLField, GraphQLInputObjectField
45

@@ -29,9 +30,34 @@ def contribute_to_class(self, cls, attname):
2930
self.type = cls
3031
cls._meta.add_field(self)
3132

33+
@property
34+
def resolver(self):
35+
return self._resolver
36+
37+
@resolver.setter
38+
def resolver(self, value):
39+
self._resolver = value
40+
41+
def get_resolver_fn(self):
42+
resolve_fn_name = 'resolve_%s' % self.attname
43+
if hasattr(self.object_type, resolve_fn_name):
44+
resolve_fn = getattr(self.object_type, resolve_fn_name)
45+
46+
@wraps(resolve_fn)
47+
def custom_resolve_fn(instance, args, info):
48+
return resolve_fn(instance, args, info)
49+
return custom_resolve_fn
50+
3251
def internal_type(self, schema):
33-
return GraphQLField(schema.T(self.type), args=self.get_arguments(schema), resolver=self.resolver,
34-
description=self.description,)
52+
resolver = self.resolver
53+
description = self.description
54+
if not resolver:
55+
resolver = self.get_resolver_fn()
56+
if not description and resolver:
57+
description = resolver.__doc__
58+
59+
return GraphQLField(schema.T(self.type), args=self.get_arguments(schema), resolver=resolver,
60+
description=description,)
3561

3662
def get_arguments(self, schema):
3763
if not self.arguments:

graphene/core/ntypes/tests/test_field.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,39 @@ class Query(ObjectType):
1717

1818
type = schema.T(field)
1919
assert field.name == 'myField'
20+
assert field.attname == 'my_field'
2021
assert isinstance(type, GraphQLField)
2122
assert type.description == 'My argument'
2223
assert type.resolver == resolver
2324
assert type.type == GraphQLString
2425

2526

27+
def test_field_objectype_resolver():
28+
field = Field(String)
29+
30+
class Query(ObjectType):
31+
my_field = field
32+
33+
def resolve_my_field(self, *args, **kwargs):
34+
'''Custom description'''
35+
return 'RESOLVED'
36+
37+
schema = Schema(query=Query)
38+
39+
type = schema.T(field)
40+
assert isinstance(type, GraphQLField)
41+
assert type.description == 'Custom description'
42+
assert type.resolver(Query(), {}, None) == 'RESOLVED'
43+
44+
2645
def test_field_custom_name():
2746
field = Field(None, name='my_customName')
2847

2948
class MyObjectType(ObjectType):
3049
my_field = field
3150

3251
assert field.name == 'my_customName'
52+
assert field.attname == 'my_field'
3353

3454

3555
def test_field_custom_arguments():
@@ -57,6 +77,7 @@ class Query(ObjectType):
5777

5878
type = schema.T(field)
5979
assert field.name == 'myField'
80+
assert field.attname == 'my_field'
6081
assert isinstance(type, GraphQLInputObjectField)
6182
assert type.description == 'My input field'
6283
assert type.default_value == '3'

0 commit comments

Comments
 (0)