Improved fields resolver

This commit is contained in:
Syrus Akbary 2015-11-09 20:38:12 -08:00
parent afe8614753
commit 9bab0d9d6f
2 changed files with 49 additions and 2 deletions

View File

@ -1,4 +1,5 @@
from collections import OrderedDict
from functools import wraps
from graphql.core.type import GraphQLField, GraphQLInputObjectField
@ -29,9 +30,34 @@ class Field(OrderedType):
self.type = cls
cls._meta.add_field(self)
@property
def resolver(self):
return self._resolver
@resolver.setter
def resolver(self, value):
self._resolver = value
def get_resolver_fn(self):
resolve_fn_name = 'resolve_%s' % self.attname
if hasattr(self.object_type, resolve_fn_name):
resolve_fn = getattr(self.object_type, resolve_fn_name)
@wraps(resolve_fn)
def custom_resolve_fn(instance, args, info):
return resolve_fn(instance, args, info)
return custom_resolve_fn
def internal_type(self, schema):
return GraphQLField(schema.T(self.type), args=self.get_arguments(schema), resolver=self.resolver,
description=self.description,)
resolver = self.resolver
description = self.description
if not resolver:
resolver = self.get_resolver_fn()
if not description and resolver:
description = resolver.__doc__
return GraphQLField(schema.T(self.type), args=self.get_arguments(schema), resolver=resolver,
description=description,)
def get_arguments(self, schema):
if not self.arguments:

View File

@ -17,12 +17,31 @@ def test_field_internal_type():
type = schema.T(field)
assert field.name == 'myField'
assert field.attname == 'my_field'
assert isinstance(type, GraphQLField)
assert type.description == 'My argument'
assert type.resolver == resolver
assert type.type == GraphQLString
def test_field_objectype_resolver():
field = Field(String)
class Query(ObjectType):
my_field = field
def resolve_my_field(self, *args, **kwargs):
'''Custom description'''
return 'RESOLVED'
schema = Schema(query=Query)
type = schema.T(field)
assert isinstance(type, GraphQLField)
assert type.description == 'Custom description'
assert type.resolver(Query(), {}, None) == 'RESOLVED'
def test_field_custom_name():
field = Field(None, name='my_customName')
@ -30,6 +49,7 @@ def test_field_custom_name():
my_field = field
assert field.name == 'my_customName'
assert field.attname == 'my_field'
def test_field_custom_arguments():
@ -57,6 +77,7 @@ def test_inputfield_internal_type():
type = schema.T(field)
assert field.name == 'myField'
assert field.attname == 'my_field'
assert isinstance(type, GraphQLInputObjectField)
assert type.description == 'My input field'
assert type.default_value == '3'