mirror of
https://github.com/graphql-python/graphene.git
synced 2024-11-22 09:36:44 +03:00
Fix ObjectType special types. Fix #425
This commit is contained in:
parent
98825fa4bc
commit
ad251e9a8d
53
graphene/tests/issues/test_425.py
Normal file
53
graphene/tests/issues/test_425.py
Normal file
|
@ -0,0 +1,53 @@
|
|||
# https://github.com/graphql-python/graphene/issues/425
|
||||
import six
|
||||
|
||||
from graphene.utils.is_base_type import is_base_type
|
||||
|
||||
from graphene.types.objecttype import ObjectTypeMeta, ObjectType
|
||||
from graphene.types.options import Options
|
||||
|
||||
class SpecialObjectTypeMeta(ObjectTypeMeta):
|
||||
|
||||
@staticmethod
|
||||
def __new__(cls, name, bases, attrs):
|
||||
# Also ensure initialization is only performed for subclasses of
|
||||
# DjangoObjectType
|
||||
if not is_base_type(bases, SpecialObjectTypeMeta):
|
||||
return type.__new__(cls, name, bases, attrs)
|
||||
|
||||
options = Options(
|
||||
attrs.pop('Meta', None),
|
||||
other_attr='default',
|
||||
)
|
||||
|
||||
return ObjectTypeMeta.__new__(cls, name, bases, dict(attrs, _meta=options))
|
||||
|
||||
return cls
|
||||
|
||||
|
||||
class SpecialObjectType(six.with_metaclass(SpecialObjectTypeMeta, ObjectType)):
|
||||
pass
|
||||
|
||||
|
||||
def test_special_objecttype_could_be_subclassed():
|
||||
class MyType(SpecialObjectType):
|
||||
class Meta:
|
||||
other_attr = 'yeah!'
|
||||
|
||||
assert MyType._meta.other_attr == 'yeah!'
|
||||
|
||||
|
||||
def test_special_objecttype_could_be_subclassed_default():
|
||||
class MyType(SpecialObjectType):
|
||||
pass
|
||||
|
||||
assert MyType._meta.other_attr == 'default'
|
||||
|
||||
|
||||
def test_special_objecttype_inherit_meta_options():
|
||||
class MyType(SpecialObjectType):
|
||||
pass
|
||||
|
||||
assert MyType._meta.name == 'MyType'
|
||||
assert MyType._meta.default_resolver == None
|
||||
assert MyType._meta.interfaces == ()
|
|
@ -19,7 +19,7 @@ class ObjectTypeMeta(AbstractTypeMeta):
|
|||
if not is_base_type(bases, ObjectTypeMeta):
|
||||
return type.__new__(cls, name, bases, attrs)
|
||||
|
||||
attrs.pop('_meta', None)
|
||||
_meta = attrs.pop('_meta', None)
|
||||
options = Options(
|
||||
attrs.pop('Meta', None),
|
||||
name=name,
|
||||
|
@ -28,6 +28,7 @@ class ObjectTypeMeta(AbstractTypeMeta):
|
|||
default_resolver=None,
|
||||
local_fields=OrderedDict(),
|
||||
)
|
||||
options.extend_with_meta(_meta)
|
||||
options.base_fields = get_base_fields(bases, _as=Field)
|
||||
|
||||
if not options.local_fields:
|
||||
|
|
|
@ -30,6 +30,13 @@ class Options(object):
|
|||
)
|
||||
)
|
||||
|
||||
def extend_with_meta(self, meta):
|
||||
if not meta:
|
||||
return
|
||||
meta_attrs = props(meta)
|
||||
for attr_name, value in meta_attrs.items():
|
||||
setattr(self, attr_name, value)
|
||||
|
||||
def __repr__(self):
|
||||
options_props = props(self)
|
||||
props_as_attrs = ' '.join(['{}={}'.format(key, value) for key, value in options_props.items()])
|
||||
|
|
Loading…
Reference in New Issue
Block a user