diff --git a/graphene/core/ntypes/field.py b/graphene/core/ntypes/field.py index a9eae3d8..13bdcf62 100644 --- a/graphene/core/ntypes/field.py +++ b/graphene/core/ntypes/field.py @@ -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: diff --git a/graphene/core/ntypes/tests/test_field.py b/graphene/core/ntypes/tests/test_field.py index e34a1184..449f52a3 100644 --- a/graphene/core/ntypes/tests/test_field.py +++ b/graphene/core/ntypes/tests/test_field.py @@ -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'