Skip to content

Commit 398f7da

Browse files
committed
Added FieldsClassType inheritance
1 parent afc5e27 commit 398f7da

File tree

4 files changed

+51
-26
lines changed

4 files changed

+51
-26
lines changed

graphene/core/classtypes/base.py

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from collections import OrderedDict
22
import inspect
33
import six
4+
import copy
45

56
from ..exceptions import SkipField
67
from .options import Options
@@ -81,6 +82,38 @@ def fields_map(self):
8182
class FieldsClassTypeMeta(ClassTypeMeta):
8283
options_class = FieldsOptions
8384

85+
def extend_fields(cls, bases):
86+
new_fields = cls._meta.local_fields
87+
field_names = {f.name: f for f in new_fields}
88+
89+
for base in bases:
90+
if not issubclass(base, FieldsClassType):
91+
continue
92+
93+
parent_fields = base._meta.local_fields
94+
for field in parent_fields:
95+
if field.name in field_names and field.type.__class__ != field_names[
96+
field.name].type.__class__:
97+
raise Exception(
98+
'Local field %r in class %r (%r) clashes '
99+
'with field with similar name from '
100+
'Interface %s (%r)' % (
101+
field.name,
102+
cls.__name__,
103+
field.__class__,
104+
base.__name__,
105+
field_names[field.name].__class__)
106+
)
107+
new_field = copy.copy(field)
108+
cls.add_to_class(field.attname, new_field)
109+
110+
111+
def construct(cls, bases, attrs):
112+
cls = super(FieldsClassTypeMeta, cls).construct(bases, attrs)
113+
if not cls._meta.abstract:
114+
cls.extend_fields(bases)
115+
return cls
116+
84117

85118
class FieldsClassType(six.with_metaclass(FieldsClassTypeMeta, ClassType)):
86119
class Meta:
@@ -96,26 +129,3 @@ def fields_internal_types(cls, schema):
96129
continue
97130

98131
return OrderedDict(fields)
99-
100-
# class NamedClassType(ClassType):
101-
# pass
102-
103-
104-
# class UnionType(NamedClassType):
105-
# class Meta:
106-
# abstract = True
107-
108-
109-
# class ObjectType(NamedClassType):
110-
# class Meta:
111-
# abstract = True
112-
113-
114-
# class InputObjectType(NamedClassType):
115-
# class Meta:
116-
# abstract = True
117-
118-
119-
# class Mutation(ObjectType):
120-
# class Meta:
121-
# abstract = True

graphene/core/classtypes/objecttype.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def internal_type(cls, schema):
8989
return GraphQLObjectType(
9090
cls._meta.type_name,
9191
description=cls._meta.description,
92-
interfaces=[schema.T(i) for i in cls._meta.interfaces],
92+
interfaces=map(schema.T, cls._meta.interfaces),
9393
fields=partial(cls.fields_internal_types, schema),
9494
is_type_of=getattr(cls, 'is_type_of', None)
9595
)

graphene/core/classtypes/tests/test_base.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,15 @@ class Character(ClassType):
2525
'''Character description'''
2626
pass
2727
assert isinstance(Character.List, List)
28+
assert Character.List.of_type == Character
2829

2930

3031
def test_classtype_definition_nonnull():
3132
class Character(ClassType):
3233
'''Character description'''
3334
pass
3435
assert isinstance(Character.NonNull, NonNull)
36+
assert Character.NonNull.of_type == Character
3537

3638

3739
def test_fieldsclasstype():
@@ -52,3 +54,16 @@ class Character(FieldsClassType):
5254
schema = Schema(query=Character)
5355
assert Character.fields_internal_types(schema)['fieldName'] == schema.T(f)
5456
assert Character._meta.fields_map['field_name'] == f
57+
58+
59+
def test_fieldsclasstype_inheritfields():
60+
name_field = Field(String())
61+
last_name_field = Field(String())
62+
63+
class Fields1(FieldsClassType):
64+
name = name_field
65+
66+
class Fields2(Fields1):
67+
last_name = last_name_field
68+
69+
assert list(Fields2._meta.fields_map.keys()) == ['name', 'last_name']

graphene/core/classtypes/tests/test_interface.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,10 @@ class ShouldBeObjectType(GeneralInterface, Character):
7171

7272

7373
def test_interface_inheritance_non_objects():
74-
class ComonClass(object):
74+
class CommonClass(object):
7575
common_attr = True
7676

77-
class Character(ComonClass, Interface):
77+
class Character(CommonClass, Interface):
7878
pass
7979

8080
class ShouldBeObjectType(Character):

0 commit comments

Comments
 (0)