Improved docs for extending Option attrs

This commit is contained in:
Syrus Akbary 2017-07-11 23:07:20 -07:00
parent e86f73d30c
commit 28c987bdd1
3 changed files with 84 additions and 36 deletions

View File

@ -1,5 +1,10 @@
# v1.0 Upgrade Guide
* `ObjectType`, `Interface`, `InputObjectType`, `Scalar` and `Enum` implementations
have been quite simplified, without the need of define a explicit Metaclass.
The metaclasses threfore are now deleted as are no longer necessary, if your code was depending
on this internal metaclass for creating custom attrs, please see an [example of how to do it now in 2.0](https://github.com/graphql-python/graphene/blob/master/graphene/tests/issues/test_425_graphene2.py).
## Deprecations

View File

@ -1,53 +1,56 @@
# https://github.com/graphql-python/graphene/issues/425
import six
# THIS IS THE OLD IMPLEMENTATION, for Graphene 1.0
# Keep here as reference for upgrade.
from graphene.utils.is_base_type import is_base_type
# # https://github.com/graphql-python/graphene/issues/425
# import six
from graphene.types.objecttype import ObjectTypeMeta, ObjectType
from graphene.types.options import Options
# from graphene.utils.is_base_type import is_base_type
class SpecialObjectTypeMeta(ObjectTypeMeta):
# from graphene.types.objecttype import ObjectTypeMeta, ObjectType
# from graphene.types.options import Options
@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)
# class SpecialObjectTypeMeta(ObjectTypeMeta):
options = Options(
attrs.pop('Meta', None),
other_attr='default',
)
# @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)
cls = ObjectTypeMeta.__new__(cls, name, bases, dict(attrs, _meta=options))
assert cls._meta is options
return cls
# options = Options(
# attrs.pop('Meta', None),
# other_attr='default',
# )
# cls = ObjectTypeMeta.__new__(cls, name, bases, dict(attrs, _meta=options))
# assert cls._meta is options
# return cls
class SpecialObjectType(six.with_metaclass(SpecialObjectTypeMeta, ObjectType)):
pass
# class SpecialObjectType(six.with_metaclass(SpecialObjectTypeMeta, ObjectType)):
# pass
def test_special_objecttype_could_be_subclassed():
class MyType(SpecialObjectType):
class Meta:
other_attr = 'yeah!'
# def test_special_objecttype_could_be_subclassed():
# class MyType(SpecialObjectType):
# class Meta:
# other_attr = 'yeah!'
assert MyType._meta.other_attr == 'yeah!'
# assert MyType._meta.other_attr == 'yeah!'
def test_special_objecttype_could_be_subclassed_default():
class MyType(SpecialObjectType):
pass
# def test_special_objecttype_could_be_subclassed_default():
# class MyType(SpecialObjectType):
# pass
assert MyType._meta.other_attr == 'default'
# assert MyType._meta.other_attr == 'default'
def test_special_objecttype_inherit_meta_options():
class MyType(SpecialObjectType):
pass
# 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 == ()
# assert MyType._meta.name == 'MyType'
# assert MyType._meta.default_resolver == None
# assert MyType._meta.interfaces == ()

View File

@ -0,0 +1,40 @@
# https://github.com/graphql-python/graphene/issues/425
# Adapted for Graphene 2.0
import six
from graphene.types.objecttype import ObjectType, ObjectTypeOptions
class SpecialOptions(ObjectTypeOptions):
other_attr = None
class SpecialObjectType(ObjectType):
@classmethod
def __init_subclass_with_meta__(cls, other_attr='default', **options):
_meta = SpecialOptions(cls)
_meta.other_attr = other_attr
super(SpecialObjectType, cls).__init_subclass_with_meta__(_meta=_meta, **options)
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 == ()