From 40ba414bd574ff56bf11ede4a41fc37045766e00 Mon Sep 17 00:00:00 2001 From: Aviv Eyal Date: Fri, 12 Apr 2019 15:26:57 -0700 Subject: [PATCH] new enum resolver code --- graphene/types/definitions.py | 5 ++++- graphene/types/enum.py | 19 +++++++++++++------ graphene/types/typemap.py | 2 +- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/graphene/types/definitions.py b/graphene/types/definitions.py index a914008c..32516229 100644 --- a/graphene/types/definitions.py +++ b/graphene/types/definitions.py @@ -36,7 +36,10 @@ class GrapheneScalarType(GrapheneGraphQLType, GraphQLScalarType): class GrapheneEnumType(GrapheneGraphQLType, GraphQLEnumType): - pass + def serialize(self, value): + if value in self.graphene_type._meta.enum: + return value.name + return super(GrapheneEnumType, self).serialize(value) class GrapheneInputObjectType(GrapheneGraphQLType, GraphQLInputObjectType): diff --git a/graphene/types/enum.py b/graphene/types/enum.py index 6e6bab8f..a6150c0d 100644 --- a/graphene/types/enum.py +++ b/graphene/types/enum.py @@ -23,13 +23,21 @@ class EnumOptions(BaseOptions): deprecation_reason = None +def _filter_magic_members(classdict): + def is_special(name): + # We also remove the Meta attribute from the class to not collide + # with the enum values. + if name == "Meta": + return True + return name[:2] == name[-2:] == "__" + + return OrderedDict((k, v) for k, v in classdict.items() if not is_special(k)) + + class EnumMeta(SubclassWithMeta_Meta): def __new__(cls, name, bases, classdict, **options): - enum_members = OrderedDict(classdict, __eq__=eq_enum) - # We remove the Meta attribute from the class to not collide - # with the enum values. - enum_members.pop("Meta", None) - enum = PyEnum(cls.__name__, enum_members) + enum_members = _filter_magic_members(classdict) + enum = PyEnum(name, enum_members) return SubclassWithMeta_Meta.__new__( cls, name, bases, OrderedDict(classdict, __enum__=enum), **options ) @@ -48,7 +56,6 @@ class EnumMeta(SubclassWithMeta_Meta): description = kwargs.pop("description", None) return cls.from_enum(PyEnum(*args, **kwargs), description=description) return super(EnumMeta, cls).__call__(*args, **kwargs) - # return cls._meta.enum(*args, **kwargs) def from_enum(cls, enum, description=None, deprecation_reason=None): # noqa: N805 description = description or enum.__doc__ diff --git a/graphene/types/typemap.py b/graphene/types/typemap.py index 9edb8518..36485427 100644 --- a/graphene/types/typemap.py +++ b/graphene/types/typemap.py @@ -151,7 +151,7 @@ class TypeMap(GraphQLTypeMap): values[name] = GraphQLEnumValue( name=name, - value=value.value, + value=value, description=description, deprecation_reason=deprecation_reason, )