new enum resolver code

This commit is contained in:
Aviv Eyal 2019-04-12 15:26:57 -07:00
parent de15657dee
commit 40ba414bd5
3 changed files with 18 additions and 8 deletions

View File

@ -36,7 +36,10 @@ class GrapheneScalarType(GrapheneGraphQLType, GraphQLScalarType):
class GrapheneEnumType(GrapheneGraphQLType, GraphQLEnumType): 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): class GrapheneInputObjectType(GrapheneGraphQLType, GraphQLInputObjectType):

View File

@ -23,13 +23,21 @@ class EnumOptions(BaseOptions):
deprecation_reason = None 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): class EnumMeta(SubclassWithMeta_Meta):
def __new__(cls, name, bases, classdict, **options): def __new__(cls, name, bases, classdict, **options):
enum_members = OrderedDict(classdict, __eq__=eq_enum) enum_members = _filter_magic_members(classdict)
# We remove the Meta attribute from the class to not collide enum = PyEnum(name, enum_members)
# with the enum values.
enum_members.pop("Meta", None)
enum = PyEnum(cls.__name__, enum_members)
return SubclassWithMeta_Meta.__new__( return SubclassWithMeta_Meta.__new__(
cls, name, bases, OrderedDict(classdict, __enum__=enum), **options cls, name, bases, OrderedDict(classdict, __enum__=enum), **options
) )
@ -48,7 +56,6 @@ class EnumMeta(SubclassWithMeta_Meta):
description = kwargs.pop("description", None) description = kwargs.pop("description", None)
return cls.from_enum(PyEnum(*args, **kwargs), description=description) return cls.from_enum(PyEnum(*args, **kwargs), description=description)
return super(EnumMeta, cls).__call__(*args, **kwargs) 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 def from_enum(cls, enum, description=None, deprecation_reason=None): # noqa: N805
description = description or enum.__doc__ description = description or enum.__doc__

View File

@ -151,7 +151,7 @@ class TypeMap(GraphQLTypeMap):
values[name] = GraphQLEnumValue( values[name] = GraphQLEnumValue(
name=name, name=name,
value=value.value, value=value,
description=description, description=description,
deprecation_reason=deprecation_reason, deprecation_reason=deprecation_reason,
) )