mirror of
https://github.com/graphql-python/graphene.git
synced 2024-11-22 09:36:44 +03:00
Improved schema type resolvers
This commit is contained in:
parent
88196103f6
commit
55e2027dbb
|
@ -62,7 +62,7 @@ class DjangoModelField(Field):
|
|||
self.object_type
|
||||
)
|
||||
)
|
||||
return _type and _type.internal_type(schema) or Field.SKIP
|
||||
return schema.T(_type) or Field.SKIP
|
||||
|
||||
def get_object_type(self, schema):
|
||||
return get_type_for_model(schema, self.model)
|
||||
|
|
|
@ -114,7 +114,7 @@ class Field(object):
|
|||
else:
|
||||
object_type = self.get_object_type(schema)
|
||||
if object_type:
|
||||
field_type = object_type.internal_type(schema)
|
||||
field_type = schema.T(object_type)
|
||||
|
||||
field_type = self.type_wrapper(field_type)
|
||||
return field_type
|
||||
|
|
|
@ -25,6 +25,7 @@ class Schema(object):
|
|||
|
||||
def __init__(self, query=None, mutation=None, name='Schema', executor=None):
|
||||
self._internal_types = {}
|
||||
self._types = {}
|
||||
self.mutation = mutation
|
||||
self.query = query
|
||||
self.name = name
|
||||
|
@ -34,6 +35,13 @@ class Schema(object):
|
|||
def __repr__(self):
|
||||
return '<Schema: %s (%s)>' % (str(self.name), hash(self))
|
||||
|
||||
def T(self, object_type):
|
||||
if not object_type:
|
||||
return
|
||||
if object_type not in self._types:
|
||||
self._types[object_type] = object_type.internal_type(self)
|
||||
return self._types[object_type]
|
||||
|
||||
@property
|
||||
def query(self):
|
||||
return self._query
|
||||
|
@ -41,7 +49,6 @@ class Schema(object):
|
|||
@query.setter
|
||||
def query(self, query):
|
||||
self._query = query
|
||||
self._query_type = query and query.internal_type(self)
|
||||
|
||||
@property
|
||||
def mutation(self):
|
||||
|
@ -50,7 +57,6 @@ class Schema(object):
|
|||
@mutation.setter
|
||||
def mutation(self, mutation):
|
||||
self._mutation = mutation
|
||||
self._mutation_type = mutation and mutation.internal_type(self)
|
||||
|
||||
@property
|
||||
def executor(self):
|
||||
|
@ -62,11 +68,11 @@ class Schema(object):
|
|||
def executor(self, value):
|
||||
self._executor = value
|
||||
|
||||
@cached_property
|
||||
@property
|
||||
def schema(self):
|
||||
if not self._query_type:
|
||||
if not self._query:
|
||||
raise Exception('You have to define a base query type')
|
||||
return GraphQLSchema(self, query=self._query_type, mutation=self._mutation_type)
|
||||
return GraphQLSchema(self, query=self.T(self._query), mutation=self.T(self._mutation))
|
||||
|
||||
def associate_internal_type(self, internal_type, object_type):
|
||||
self._internal_types[internal_type.name] = object_type
|
||||
|
@ -76,6 +82,7 @@ class Schema(object):
|
|||
return object_type
|
||||
|
||||
def get_type(self, type_name):
|
||||
self.schema._build_type_map()
|
||||
if type_name not in self._internal_types:
|
||||
raise Exception('Type %s not found in %r' % (type_name, self))
|
||||
return self._internal_types[type_name]
|
||||
|
|
|
@ -179,15 +179,14 @@ class BaseObjectType(object):
|
|||
|
||||
@classmethod
|
||||
def resolve_objecttype(cls, schema, instance, *_):
|
||||
return instance
|
||||
return instance.__class__
|
||||
|
||||
@classmethod
|
||||
def resolve_type(cls, schema, instance, *_):
|
||||
objecttype = cls.resolve_objecttype(schema, instance, *_)
|
||||
return objecttype.internal_type(schema)
|
||||
return schema.T(objecttype)
|
||||
|
||||
@classmethod
|
||||
@memoize
|
||||
@register_internal_type
|
||||
def internal_type(cls, schema):
|
||||
fields = lambda: OrderedDict([(f.name, f.internal_field(schema))
|
||||
|
@ -203,7 +202,7 @@ class BaseObjectType(object):
|
|||
return GraphQLObjectType(
|
||||
cls._meta.type_name,
|
||||
description=cls._meta.description,
|
||||
interfaces=[i.internal_type(schema) for i in cls._meta.interfaces],
|
||||
interfaces=[schema.T(i) for i in cls._meta.interfaces],
|
||||
fields=fields,
|
||||
is_type_of=getattr(cls, 'is_type_of', None)
|
||||
)
|
||||
|
@ -225,7 +224,6 @@ class Mutation(six.with_metaclass(ObjectTypeMeta, BaseObjectType)):
|
|||
|
||||
class InputObjectType(ObjectType):
|
||||
@classmethod
|
||||
@memoize
|
||||
@register_internal_type
|
||||
def internal_type(cls, schema):
|
||||
fields = lambda: OrderedDict([(f.name, f.internal_field(schema))
|
||||
|
|
|
@ -63,8 +63,8 @@ class ConnectionField(Field):
|
|||
node = self.get_object_type(schema)
|
||||
assert is_node(node), 'Only nodes have connections.'
|
||||
schema.register(node)
|
||||
|
||||
return self.get_connection_type(node).internal_type(schema)
|
||||
connection_type = self.get_connection_type(node)
|
||||
return schema.T(connection_type)
|
||||
|
||||
|
||||
class NodeField(Field):
|
||||
|
|
|
@ -50,7 +50,7 @@ def test_django_interface():
|
|||
|
||||
|
||||
def test_pseudo_interface():
|
||||
object_type = Character.internal_type(schema)
|
||||
object_type = schema.T(Character)
|
||||
assert Character._meta.is_interface is True
|
||||
assert isinstance(object_type, GraphQLInterfaceType)
|
||||
assert Character._meta.model == Reporter
|
||||
|
@ -81,7 +81,7 @@ def test_interface_resolve_type():
|
|||
|
||||
|
||||
def test_object_type():
|
||||
object_type = Human.internal_type(schema)
|
||||
object_type = schema.T(Human)
|
||||
fields_map = Human._meta.fields_map
|
||||
assert Human._meta.is_interface is False
|
||||
assert isinstance(object_type, GraphQLObjectType)
|
||||
|
@ -95,7 +95,7 @@ def test_object_type():
|
|||
# 'reporter': fields_map['reporter'].internal_field(schema),
|
||||
# 'pubDate': fields_map['pub_date'].internal_field(schema),
|
||||
# }
|
||||
assert DjangoNode.internal_type(schema) in object_type.get_interfaces()
|
||||
assert schema.T(DjangoNode) in object_type.get_interfaces()
|
||||
|
||||
|
||||
def test_node_notinterface():
|
||||
|
|
|
@ -46,7 +46,7 @@ class Human(Character):
|
|||
|
||||
schema = Schema()
|
||||
|
||||
Human_type = Human.internal_type(schema)
|
||||
Human_type = schema.T(Human)
|
||||
|
||||
|
||||
def test_type():
|
||||
|
|
|
@ -125,9 +125,23 @@ def test_schema_register():
|
|||
class MyType(ObjectType):
|
||||
type = StringField(resolve=lambda *_: 'Dog')
|
||||
|
||||
schema.query = MyType
|
||||
|
||||
assert schema.get_type('MyType') == MyType
|
||||
|
||||
|
||||
def test_schema_register():
|
||||
schema = Schema(name='My own schema')
|
||||
|
||||
@schema.register
|
||||
class MyType(ObjectType):
|
||||
type = StringField(resolve=lambda *_: 'Dog')
|
||||
|
||||
with raises(Exception) as excinfo:
|
||||
schema.get_type('MyType')
|
||||
assert 'base query type' in str(excinfo.value)
|
||||
|
||||
|
||||
def test_schema_introspect():
|
||||
schema = Schema(name='My own schema')
|
||||
|
||||
|
@ -138,4 +152,3 @@ def test_schema_introspect():
|
|||
|
||||
introspection = schema.introspect()
|
||||
assert '__schema' in introspection
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ schema = Schema()
|
|||
|
||||
|
||||
def test_interface():
|
||||
object_type = Character.internal_type(schema)
|
||||
object_type = schema.T(Character)
|
||||
assert Character._meta.is_interface is True
|
||||
assert isinstance(object_type, GraphQLInterfaceType)
|
||||
assert Character._meta.type_name == 'core_Character'
|
||||
|
@ -54,7 +54,7 @@ def test_interface_resolve_type():
|
|||
|
||||
|
||||
def test_object_type():
|
||||
object_type = Human.internal_type(schema)
|
||||
object_type = schema.T(Human)
|
||||
assert Human._meta.is_interface is False
|
||||
assert Human._meta.type_name == 'core_Human'
|
||||
assert isinstance(object_type, GraphQLObjectType)
|
||||
|
@ -62,7 +62,7 @@ def test_object_type():
|
|||
assert list(object_type.get_fields().keys()) == ['name', 'friends']
|
||||
# assert object_type.get_fields() == {'name': Human._meta.fields_map['name'].internal_field(
|
||||
# schema), 'friends': Human._meta.fields_map['friends'].internal_field(schema)}
|
||||
assert object_type.get_interfaces() == [Character.internal_type(schema)]
|
||||
assert object_type.get_interfaces() == [schema.T(Character)]
|
||||
assert Human._meta.fields_map['name'].object_type == Human
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user