From b474010060cba077af65d0a6dfe50f9a1cd09ad1 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 10 Nov 2015 11:54:20 -0800 Subject: [PATCH] Added LazyType --- graphene/core/schema.py | 3 +-- graphene/core/types/base.py | 9 +++++++++ graphene/core/types/field.py | 5 ++++- graphene/core/types/tests/test_field.py | 20 ++++++++++++++++++++ 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/graphene/core/schema.py b/graphene/core/schema.py index 66184b61..baf46d59 100644 --- a/graphene/core/schema.py +++ b/graphene/core/schema.py @@ -36,8 +36,7 @@ class Schema(object): def T(self, object_type): if not object_type: return - # if inspect.isclass(object_type) and issubclass(object_type, BaseType): - if True: + if inspect.isclass(object_type) and issubclass(object_type, BaseType) or isinstance(object_type, BaseType): if object_type not in self._types: internal_type = object_type.internal_type(self) self._types[object_type] = internal_type diff --git a/graphene/core/types/base.py b/graphene/core/types/base.py index e1ca98ae..cc8d4e20 100644 --- a/graphene/core/types/base.py +++ b/graphene/core/types/base.py @@ -7,6 +7,15 @@ class BaseType(object): return getattr(cls, 'T', None) +class LazyType(BaseType): + def __init__(self, type_str): + self.type_str = type_str + + def internal_type(self, schema): + type = schema.get_type(self.type_str) + return schema.T(type) + + @total_ordering class OrderedType(BaseType): creation_counter = 0 diff --git a/graphene/core/types/field.py b/graphene/core/types/field.py index 5e03e2d0..d6367b5f 100644 --- a/graphene/core/types/field.py +++ b/graphene/core/types/field.py @@ -1,9 +1,10 @@ +import six from collections import OrderedDict from functools import wraps from graphql.core.type import GraphQLField, GraphQLInputObjectField -from .base import OrderedType +from .base import LazyType, OrderedType from .argument import to_arguments from ...utils import to_camel_case from ..types import BaseObjectType, InputObjectType @@ -18,6 +19,8 @@ class Field(OrderedType): _creation_counter = kwargs.pop('_creation_counter', None) super(Field, self).__init__(_creation_counter=_creation_counter) self.name = name + if isinstance(type, six.string_types) and type != 'self': + type = LazyType(type) self.type = type self.description = description args = OrderedDict(args or {}, **kwargs) diff --git a/graphene/core/types/tests/test_field.py b/graphene/core/types/tests/test_field.py index 449f52a3..5f8042d5 100644 --- a/graphene/core/types/tests/test_field.py +++ b/graphene/core/types/tests/test_field.py @@ -2,6 +2,7 @@ from graphql.core.type import GraphQLField, GraphQLInputObjectField, GraphQLStri from ..field import Field, InputField from ..scalars import String +from ..base import LazyType from graphene.core.types import ObjectType, InputObjectType from graphene.core.schema import Schema @@ -52,6 +53,25 @@ def test_field_custom_name(): assert field.attname == 'my_field' +def test_field_self(): + field = Field('self', name='my_customName') + + class MyObjectType(ObjectType): + my_field = field + + assert field.type == MyObjectType + + +def test_field_string_reference(): + field = Field('MyObjectType', name='my_customName') + + class MyObjectType(ObjectType): + my_field = field + + assert isinstance(field.type, LazyType) + assert field.type.type_str == 'MyObjectType' + + def test_field_custom_arguments(): field = Field(None, name='my_customName', p=String())