From 28c987bdd112c42f069ef0ae3b9be6b27a69f8fb Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 11 Jul 2017 23:07:20 -0700 Subject: [PATCH] Improved docs for extending Option attrs --- UPGRADE-v2.0.md | 5 ++ graphene/tests/issues/test_425.py | 75 +++++++++++---------- graphene/tests/issues/test_425_graphene2.py | 40 +++++++++++ 3 files changed, 84 insertions(+), 36 deletions(-) create mode 100644 graphene/tests/issues/test_425_graphene2.py diff --git a/UPGRADE-v2.0.md b/UPGRADE-v2.0.md index 2a46a005..a0f6c86b 100644 --- a/UPGRADE-v2.0.md +++ b/UPGRADE-v2.0.md @@ -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 diff --git a/graphene/tests/issues/test_425.py b/graphene/tests/issues/test_425.py index 08bdde8c..42ee1178 100644 --- a/graphene/tests/issues/test_425.py +++ b/graphene/tests/issues/test_425.py @@ -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 == () diff --git a/graphene/tests/issues/test_425_graphene2.py b/graphene/tests/issues/test_425_graphene2.py new file mode 100644 index 00000000..38b12143 --- /dev/null +++ b/graphene/tests/issues/test_425_graphene2.py @@ -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 == ()