Move enum middleware into compat module

This commit is contained in:
Jonathan Kim 2020-03-14 16:46:19 +00:00
parent 9367ae5d86
commit c30d8d0231
4 changed files with 37 additions and 27 deletions

View File

View File

@ -0,0 +1,28 @@
from graphql import OperationType
from ..utils.str_converters import to_snake_case
from ..types.definitions import GrapheneEnumType
from ..types.utils import get_underlying_type
def enum_value_convertor_middleware(next, root, info, **args):
"""
Compatibility middleware for upgrading to v3:
Convert enums to their values for mutation inputs, like the behaviour in v2
"""
operation = info.operation.operation
if operation == OperationType.MUTATION:
input_arguments = info.parent_type.fields[info.field_name].args
for arg_name, arg in input_arguments.items():
_type = get_underlying_type(arg.type)
if isinstance(_type, GrapheneEnumType):
# Convert inputs to value
arg_name = to_snake_case(arg_name)
input_value = args.get(arg_name, None)
if input_value and isinstance(
input_value, _type.graphene_type._meta.enum
):
args[arg_name] = args[arg_name].value
return next(root, info, **args)

View File

@ -1,9 +1,7 @@
from textwrap import dedent from textwrap import dedent
from graphql import OperationType
from graphene.utils.str_converters import to_snake_case from graphene.compat.middleware import enum_value_convertor_middleware
from ..argument import Argument from ..argument import Argument
from ..definitions import GrapheneEnumType
from ..enum import Enum, PyEnum from ..enum import Enum, PyEnum
from ..field import Field from ..field import Field
from ..inputfield import InputField from ..inputfield import InputField
@ -398,12 +396,6 @@ def test_enum_mutation():
assert results.data["setFavColor"]["favColor"] == Color.RED.name assert results.data["setFavColor"]["favColor"] == Color.RED.name
def get_underlying_type(_type):
while hasattr(_type, "of_type"):
_type = _type.of_type
return _type
def test_enum_mutation_compat(): def test_enum_mutation_compat():
from enum import Enum as PyEnum from enum import Enum as PyEnum
@ -436,23 +428,6 @@ def test_enum_mutation_compat():
class MyMutations(ObjectType): class MyMutations(ObjectType):
set_fav_color = SetFavColor.Field() set_fav_color = SetFavColor.Field()
def enum_compat_middleware(next, root, info, **args):
operation = info.operation.operation
if operation == OperationType.MUTATION:
input_arguments = info.parent_type.fields[info.field_name].args
for arg_name, arg in input_arguments.items():
_type = get_underlying_type(arg.type)
if isinstance(_type, GrapheneEnumType):
# Convert inputs to value
arg_name = to_snake_case(arg_name)
input_value = args.get(arg_name, None)
if input_value and isinstance(
input_value, _type.graphene_type._meta.enum
):
args[arg_name] = args[arg_name].value
return next(root, info, **args)
schema = Schema(query=Query, mutation=MyMutations) schema = Schema(query=Query, mutation=MyMutations)
results = schema.execute( results = schema.execute(
@ -461,7 +436,7 @@ def test_enum_mutation_compat():
favColor favColor
} }
}""", }""",
middleware=[enum_compat_middleware], middleware=[enum_value_convertor_middleware],
) )
assert not results.errors assert not results.errors

View File

@ -41,3 +41,10 @@ def get_type(_type):
if inspect.isfunction(_type) or isinstance(_type, partial): if inspect.isfunction(_type) or isinstance(_type, partial):
return _type() return _type()
return _type return _type
def get_underlying_type(_type):
"""Get the underlying type even if it is wrapped in structures like NonNull"""
while hasattr(_type, "of_type"):
_type = _type.of_type
return _type