Added FieldsClassType inheritance

This commit is contained in:
Syrus Akbary 2015-12-02 20:39:20 -08:00
parent afc5e2720b
commit 398f7da24c
4 changed files with 51 additions and 26 deletions

View File

@ -1,6 +1,7 @@
from collections import OrderedDict from collections import OrderedDict
import inspect import inspect
import six import six
import copy
from ..exceptions import SkipField from ..exceptions import SkipField
from .options import Options from .options import Options
@ -81,6 +82,38 @@ class FieldsOptions(Options):
class FieldsClassTypeMeta(ClassTypeMeta): class FieldsClassTypeMeta(ClassTypeMeta):
options_class = FieldsOptions options_class = FieldsOptions
def extend_fields(cls, bases):
new_fields = cls._meta.local_fields
field_names = {f.name: f for f in new_fields}
for base in bases:
if not issubclass(base, FieldsClassType):
continue
parent_fields = base._meta.local_fields
for field in parent_fields:
if field.name in field_names and field.type.__class__ != field_names[
field.name].type.__class__:
raise Exception(
'Local field %r in class %r (%r) clashes '
'with field with similar name from '
'Interface %s (%r)' % (
field.name,
cls.__name__,
field.__class__,
base.__name__,
field_names[field.name].__class__)
)
new_field = copy.copy(field)
cls.add_to_class(field.attname, new_field)
def construct(cls, bases, attrs):
cls = super(FieldsClassTypeMeta, cls).construct(bases, attrs)
if not cls._meta.abstract:
cls.extend_fields(bases)
return cls
class FieldsClassType(six.with_metaclass(FieldsClassTypeMeta, ClassType)): class FieldsClassType(six.with_metaclass(FieldsClassTypeMeta, ClassType)):
class Meta: class Meta:
@ -96,26 +129,3 @@ class FieldsClassType(six.with_metaclass(FieldsClassTypeMeta, ClassType)):
continue continue
return OrderedDict(fields) return OrderedDict(fields)
# class NamedClassType(ClassType):
# pass
# class UnionType(NamedClassType):
# class Meta:
# abstract = True
# class ObjectType(NamedClassType):
# class Meta:
# abstract = True
# class InputObjectType(NamedClassType):
# class Meta:
# abstract = True
# class Mutation(ObjectType):
# class Meta:
# abstract = True

View File

@ -89,7 +89,7 @@ class ObjectType(six.with_metaclass(ObjectTypeMeta, FieldsClassType)):
return GraphQLObjectType( return GraphQLObjectType(
cls._meta.type_name, cls._meta.type_name,
description=cls._meta.description, description=cls._meta.description,
interfaces=[schema.T(i) for i in cls._meta.interfaces], interfaces=map(schema.T, cls._meta.interfaces),
fields=partial(cls.fields_internal_types, schema), fields=partial(cls.fields_internal_types, schema),
is_type_of=getattr(cls, 'is_type_of', None) is_type_of=getattr(cls, 'is_type_of', None)
) )

View File

@ -25,6 +25,7 @@ def test_classtype_definition_list():
'''Character description''' '''Character description'''
pass pass
assert isinstance(Character.List, List) assert isinstance(Character.List, List)
assert Character.List.of_type == Character
def test_classtype_definition_nonnull(): def test_classtype_definition_nonnull():
@ -32,6 +33,7 @@ def test_classtype_definition_nonnull():
'''Character description''' '''Character description'''
pass pass
assert isinstance(Character.NonNull, NonNull) assert isinstance(Character.NonNull, NonNull)
assert Character.NonNull.of_type == Character
def test_fieldsclasstype(): def test_fieldsclasstype():
@ -52,3 +54,16 @@ def test_fieldsclasstype_fieldtype():
schema = Schema(query=Character) schema = Schema(query=Character)
assert Character.fields_internal_types(schema)['fieldName'] == schema.T(f) assert Character.fields_internal_types(schema)['fieldName'] == schema.T(f)
assert Character._meta.fields_map['field_name'] == f assert Character._meta.fields_map['field_name'] == f
def test_fieldsclasstype_inheritfields():
name_field = Field(String())
last_name_field = Field(String())
class Fields1(FieldsClassType):
name = name_field
class Fields2(Fields1):
last_name = last_name_field
assert list(Fields2._meta.fields_map.keys()) == ['name', 'last_name']

View File

@ -71,10 +71,10 @@ def test_interface_inheritance():
def test_interface_inheritance_non_objects(): def test_interface_inheritance_non_objects():
class ComonClass(object): class CommonClass(object):
common_attr = True common_attr = True
class Character(ComonClass, Interface): class Character(CommonClass, Interface):
pass pass
class ShouldBeObjectType(Character): class ShouldBeObjectType(Character):