diff --git a/graphene/__init__.py b/graphene/__init__.py index 5d6d41d7..aae2a3ae 100644 --- a/graphene/__init__.py +++ b/graphene/__init__.py @@ -49,6 +49,7 @@ if not __SETUP__: from .utils.resolve_only_args import resolve_only_args from .utils.module_loading import lazy_import from .utils.annotate import annotate + from .utils.auto_resolver import final_resolver, is_final_resolver __all__ = [ 'ObjectType', @@ -84,6 +85,8 @@ if not __SETUP__: 'annotate', 'Context', 'ResolveInfo', + 'final_resolver', + 'is_final_resolver', # Deprecated 'AbstractType', diff --git a/graphene/relay/connection.py b/graphene/relay/connection.py index 5470e57e..5906ec06 100644 --- a/graphene/relay/connection.py +++ b/graphene/relay/connection.py @@ -10,6 +10,7 @@ from ..types import (Boolean, Enum, Int, Interface, List, NonNull, Scalar, from ..types.field import Field from ..types.objecttype import ObjectType, ObjectTypeOptions from ..utils.deprecated import warn_deprecation +from ..utils.auto_resolver import final_resolver from .node import is_node @@ -142,7 +143,7 @@ class IterableConnectionField(Field): def get_resolver(self, parent_resolver): resolver = super(IterableConnectionField, self).get_resolver(parent_resolver) - return partial(self.connection_resolver, resolver, self.type) + return final_resolver(partial(self.connection_resolver, resolver, self.type)) ConnectionField = IterableConnectionField diff --git a/graphene/relay/mutation.py b/graphene/relay/mutation.py index 6414a533..84e1e87b 100644 --- a/graphene/relay/mutation.py +++ b/graphene/relay/mutation.py @@ -58,7 +58,7 @@ class ClientIDMutation(Mutation): ) @classmethod - @annotate(context=Context, info=ResolveInfo) + @annotate(context=Context, info=ResolveInfo, _trigger_warning=False) def mutate(cls, root, input, context, info): def on_resolve(payload): try: diff --git a/graphene/relay/node.py b/graphene/relay/node.py index ca31447d..8b89f8f3 100644 --- a/graphene/relay/node.py +++ b/graphene/relay/node.py @@ -3,9 +3,11 @@ from functools import partial from graphql_relay import from_global_id, to_global_id -from ..types import ID, Field, Interface, ObjectType +from ..types import ID, Field, Interface, ObjectType, Context, ResolveInfo from ..types.interface import InterfaceOptions from ..types.utils import get_type +from ..utils.annotate import annotate +from ..utils.auto_resolver import final_resolver def is_node(objecttype): @@ -35,7 +37,9 @@ class GlobalID(Field): return node.to_global_id(parent_type_name, type_id) # root._meta.name def get_resolver(self, parent_resolver): - return partial(self.id_resolver, parent_resolver, self.node, parent_type_name=self.parent_type_name) + return final_resolver(partial( + self.id_resolver, parent_resolver, self.node, parent_type_name=self.parent_type_name + )) class NodeField(Field): @@ -79,8 +83,9 @@ class Node(AbstractNode): return NodeField(cls, *args, **kwargs) @classmethod - def node_resolver(cls, root, args, context, info, only_type=None): - return cls.get_node_from_global_id(args.get('id'), context, info, only_type) + @annotate(context=Context, info=ResolveInfo, _trigger_warning=False) + def node_resolver(cls, root, id, context, info, only_type=None): + return cls.get_node_from_global_id(id, context, info, only_type) @classmethod def get_node_from_global_id(cls, global_id, context, info, only_type=None): diff --git a/graphene/types/mutation.py b/graphene/types/mutation.py index e44f8c15..213c0f48 100644 --- a/graphene/types/mutation.py +++ b/graphene/types/mutation.py @@ -5,7 +5,6 @@ from ..utils.props import props from .field import Field from .objecttype import ObjectType, ObjectTypeOptions from .utils import yank_fields_from_attrs -from ..utils.auto_resolver import auto_resolver from ..utils.deprecated import warn_deprecation @@ -63,7 +62,7 @@ class Mutation(ObjectType): _meta.fields = fields _meta.output = output - _meta.resolver = auto_resolver(resolver) + _meta.resolver = resolver _meta.arguments = arguments super(Mutation, cls).__init_subclass_with_meta__(_meta=_meta, **options) diff --git a/graphene/types/tests/test_mutation.py b/graphene/types/tests/test_mutation.py index 79544af5..d195b6ac 100644 --- a/graphene/types/tests/test_mutation.py +++ b/graphene/types/tests/test_mutation.py @@ -18,7 +18,7 @@ def test_generate_mutation_no_args(): assert issubclass(MyMutation, ObjectType) assert MyMutation._meta.name == "MyMutation" assert MyMutation._meta.description == "Documentation" - resolved = MyMutation.Field().resolver(None, {'name': 'Peter'}, None, None) + resolved = MyMutation.Field().resolver(None, name='Peter') assert resolved == {'name': 'Peter'} @@ -34,7 +34,7 @@ def test_generate_mutation_with_meta(): assert MyMutation._meta.name == "MyOtherMutation" assert MyMutation._meta.description == "Documentation" - resolved = MyMutation.Field().resolver(None, {'name': 'Peter'}, None, None) + resolved = MyMutation.Field().resolver(None, name='Peter') assert resolved == {'name': 'Peter'} @@ -65,7 +65,7 @@ def test_mutation_custom_output_type(): field = CreateUser.Field() assert field.type == User assert field.args == {'name': Argument(String)} - resolved = field.resolver(None, {'name': 'Peter'}, None, None) + resolved = field.resolver(None, name='Peter') assert isinstance(resolved, User) assert resolved.name == 'Peter' diff --git a/graphene/types/typemap.py b/graphene/types/typemap.py index 17ff95b1..36d8db4b 100644 --- a/graphene/types/typemap.py +++ b/graphene/types/typemap.py @@ -256,15 +256,13 @@ class TypeMap(GraphQLTypeMap): _field = GraphQLField( field_type, args=args, - resolver=field.get_resolver( - auto_resolver( - self.get_resolver_for_type( - type, - name, - field.default_value - ) - ) - ), + resolver=auto_resolver(field.get_resolver( + auto_resolver(self.get_resolver_for_type( + type, + name, + field.default_value + )) + )), deprecation_reason=field.deprecation_reason, description=field.description) field_name = field.name or self.get_name(name) diff --git a/graphene/utils/tests/test_auto_resolver.py b/graphene/utils/tests/test_auto_resolver.py index 9fa58c22..3b135d83 100644 --- a/graphene/utils/tests/test_auto_resolver.py +++ b/graphene/utils/tests/test_auto_resolver.py @@ -14,7 +14,7 @@ def resolver_annotated(root, **args): return root, args, None, None -@annotate(context=Context, info=ResolveInfo) +@annotate(context=Context, info=ResolveInfo, _trigger_warning=False) def resolver_with_context_and_info(root, context, info, **args): return root, args, context, info