Skip to content

Commit a069f9c

Browse files
committed
[v0.3.2] Add support for discovering fields from bases.
Closes #5
1 parent b4b0f09 commit a069f9c

File tree

5 files changed

+25
-5
lines changed

5 files changed

+25
-5
lines changed

epoxy/metaclasses/input_type.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def __new__(mcs, name, bases, attrs):
1616

1717
name = attrs.pop('_name', name)
1818
class_ref = WeakRefHolder()
19-
declared_fields = get_declared_fields(name, yank_potential_fields(attrs, InputField), InputField)
19+
declared_fields = get_declared_fields(name, yank_potential_fields(attrs, bases, InputField), InputField)
2020
interface = GraphQLInputObjectType(
2121
name,
2222
fields=partial(mcs._build_field_map, class_ref, declared_fields),

epoxy/metaclasses/interface.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def __new__(mcs, name, bases, attrs):
1313
return super(InterfaceMeta, mcs).__new__(mcs, name, bases, attrs)
1414

1515
class_ref = WeakRefHolder()
16-
declared_fields = get_declared_fields(name, yank_potential_fields(attrs))
16+
declared_fields = get_declared_fields(name, yank_potential_fields(attrs, bases))
1717
interface = GraphQLInterfaceType(
1818
name,
1919
fields=partial(mcs._build_field_map, class_ref, declared_fields),

epoxy/metaclasses/object_type.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ def __new__(mcs, name, bases, attrs):
1616
name = attrs.pop('_name', name)
1717
class_ref = WeakRefHolder()
1818
registry = mcs._get_registry()
19-
declared_fields = get_declared_fields(name, yank_potential_fields(attrs))
19+
20+
declared_fields = get_declared_fields(name, yank_potential_fields(attrs, bases))
2021

2122
with no_implementation_registration():
2223
object_type = GraphQLObjectType(

epoxy/utils/yank_potential_fields.py

+9-1
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,18 @@
22
from .thunk import TypeThunk
33

44

5-
def yank_potential_fields(attrs, field_class=Field):
5+
def yank_potential_fields(attrs, bases, field_class=Field):
66
field_attrs = {}
77
potential_types = (field_class, TypeThunk)
88

9+
for klass in reversed(bases):
10+
for field_attr_name, obj in klass.__dict__.items():
11+
if field_attr_name == 'T':
12+
continue
13+
14+
if isinstance(obj, potential_types):
15+
field_attrs[field_attr_name] = obj
16+
917
for field_attr_name, obj in list(attrs.items()):
1018
if field_attr_name == 'T':
1119
continue

tests/test_declarative_definition.py

+12-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ def check_dog(R, Dog):
1313
assert fields['name'].type == GraphQLString
1414
assert fields['name'].name == 'name'
1515

16-
1716
def test_register_single_type():
1817
R = TypeRegistry()
1918

@@ -50,6 +49,18 @@ class Dog(R.ObjectType):
5049
check_dog(R, Dog)
5150

5251

52+
def test_can_use_mixins():
53+
R = TypeRegistry()
54+
55+
class DogMixin():
56+
name = R.String
57+
58+
class Dog(R.ObjectType, DogMixin):
59+
pass
60+
61+
check_dog(R, Dog)
62+
63+
5364
def test_register_type_can_declare_builtin_scalar_type_as_non_null():
5465
R = TypeRegistry()
5566

0 commit comments

Comments
 (0)