Fixed runtime type resolution.

This commit is contained in:
Syrus Akbary 2016-08-14 10:20:09 -07:00
parent a0228ae6b2
commit dbc981c6d2
4 changed files with 16 additions and 10 deletions

View File

@ -34,9 +34,7 @@ class InterfaceMeta(AbstractTypeMeta):
class Interface(six.with_metaclass(InterfaceMeta)): class Interface(six.with_metaclass(InterfaceMeta)):
@classmethod resolve_type = None
def resolve_type(cls, root, args, info):
return type(root)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
raise Exception("An Interface cannot be intitialized") raise Exception("An Interface cannot be intitialized")

View File

@ -17,7 +17,8 @@ class ObjectTypeMeta(AbstractTypeMeta):
if not is_base_type(bases, ObjectTypeMeta): if not is_base_type(bases, ObjectTypeMeta):
return type.__new__(cls, name, bases, attrs) return type.__new__(cls, name, bases, attrs)
options = Options( _meta = attrs.pop('_meta', None)
options = _meta or Options(
attrs.pop('Meta', None), attrs.pop('Meta', None),
name=name, name=name,
description=attrs.get('__doc__'), description=attrs.get('__doc__'),
@ -49,8 +50,10 @@ class ObjectTypeMeta(AbstractTypeMeta):
class ObjectType(six.with_metaclass(ObjectTypeMeta)): class ObjectType(six.with_metaclass(ObjectTypeMeta)):
@classmethod
is_type_of = None def is_type_of(cls, root, context, info):
if isinstance(root, cls):
return True
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
# ObjectType acting as container # ObjectType acting as container

View File

@ -139,12 +139,15 @@ class TypeMap(GraphQLTypeMap):
@classmethod @classmethod
def construct_interface(cls, map, type): def construct_interface(cls, map, type):
from .definitions import GrapheneInterfaceType from .definitions import GrapheneInterfaceType
_resolve_type = None
if type.resolve_type:
_resolve_type = partial(resolve_type, type.resolve_type, map)
map[type._meta.name] = GrapheneInterfaceType( map[type._meta.name] = GrapheneInterfaceType(
graphene_type=type, graphene_type=type,
name=type._meta.name, name=type._meta.name,
description=type._meta.description, description=type._meta.description,
fields=None, fields=None,
resolve_type=partial(resolve_type, type.resolve_type, map), resolve_type=_resolve_type,
) )
map[type._meta.name]._fields = cls.construct_fields_for_type(map, type) map[type._meta.name]._fields = cls.construct_fields_for_type(map, type)
# cls.reducer(map, map[type._meta.name]) # cls.reducer(map, map[type._meta.name])
@ -165,6 +168,9 @@ class TypeMap(GraphQLTypeMap):
@classmethod @classmethod
def construct_union(cls, map, type): def construct_union(cls, map, type):
from .definitions import GrapheneUnionType from .definitions import GrapheneUnionType
_resolve_type = None
if type.resolve_type:
_resolve_type = partial(resolve_type, type.resolve_type, map)
types = [] types = []
for i in type._meta.types: for i in type._meta.types:
map = cls.construct_objecttype(map, i) map = cls.construct_objecttype(map, i)
@ -173,7 +179,7 @@ class TypeMap(GraphQLTypeMap):
graphene_type=type, graphene_type=type,
name=type._meta.name, name=type._meta.name,
types=types, types=types,
resolve_type=type.resolve_type, resolve_type=_resolve_type,
) )
map[type._meta.name].types = types map[type._meta.name].types = types
return map return map

View File

@ -31,8 +31,7 @@ class UnionMeta(type):
class Union(six.with_metaclass(UnionMeta)): class Union(six.with_metaclass(UnionMeta)):
def resolve_type(self, _type): resolve_type = None
return type(_type)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
raise Exception("An Union cannot be intitialized") raise Exception("An Union cannot be intitialized")