Skip to content

Commit a3e7b48

Browse files
committed
Add flag for using enum names or members as values (#73)
1 parent 9c02a9f commit a3e7b48

File tree

2 files changed

+57
-4
lines changed

2 files changed

+57
-4
lines changed

src/graphql/type/definition.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1091,14 +1091,18 @@ def assert_union_type(type_: Any) -> GraphQLUnionType:
10911091

10921092
class GraphQLEnumTypeKwargs(GraphQLNamedTypeKwargs, total=False):
10931093
values: GraphQLEnumValueMap
1094+
names_as_values: Optional[bool]
10941095

10951096

10961097
class GraphQLEnumType(GraphQLNamedType):
10971098
"""Enum Type Definition
10981099
10991100
Some leaf values of requests and input values are Enums. GraphQL serializes Enum
11001101
values as strings, however internally Enums can be represented by any kind of type,
1101-
often integers. They can also be provided as a Python Enum.
1102+
often integers. They can also be provided as a Python Enum. In this case, the flag
1103+
`names_as_values` determines what will be used as internal representation. The
1104+
default value of `False` will use the enum values, the value `True` will use the
1105+
enum names, and the value `None` will use the members themselves.
11021106
11031107
Example::
11041108
@@ -1132,6 +1136,7 @@ def __init__(
11321136
self,
11331137
name: str,
11341138
values: Union[GraphQLEnumValueMap, Mapping[str, Any], Type[Enum]],
1139+
names_as_values: Optional[bool] = False,
11351140
description: Optional[str] = None,
11361141
extensions: Optional[Dict[str, Any]] = None,
11371142
ast_node: Optional[EnumTypeDefinitionNode] = None,
@@ -1158,10 +1163,13 @@ def __init__(
11581163
f"{name} values must be an Enum or a mapping"
11591164
" with value names as keys."
11601165
)
1161-
values = cast(Dict, values)
1166+
values = cast(Dict[str, Any], values)
11621167
else:
1163-
values = cast(Dict, values)
1164-
values = {key: value.value for key, value in values.items()}
1168+
values = cast(Dict[str, Enum], values)
1169+
if names_as_values is False:
1170+
values = {key: value.value for key, value in values.items()}
1171+
elif names_as_values is True:
1172+
values = {key: key for key in values}
11651173
values = {
11661174
assert_enum_value_name(key): value
11671175
if isinstance(value, GraphQLEnumValue)

tests/type/test_definition.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from enum import Enum
12
from math import isnan, nan
23
from typing import cast, Dict
34

@@ -1057,6 +1058,50 @@ def rejects_a_union_type_with_incorrect_extension_ast_nodes():
10571058

10581059

10591060
def describe_type_system_enums():
1061+
def defines_an_enum_using_a_dict():
1062+
enum_type = GraphQLEnumType("SomeEnum", {"RED": 1, "BLUE": 2})
1063+
assert enum_type.values == {
1064+
"RED": GraphQLEnumValue(1),
1065+
"BLUE": GraphQLEnumValue(2),
1066+
}
1067+
1068+
def defines_an_enum_using_an_enum_value_map():
1069+
red, blue = GraphQLEnumValue(1), GraphQLEnumValue(2)
1070+
enum_type = GraphQLEnumType("SomeEnum", {"RED": red, "BLUE": blue})
1071+
assert enum_type.values == {"RED": red, "BLUE": blue}
1072+
1073+
def defines_an_enum_using_a_python_enum():
1074+
colors = Enum("Colors", "RED BLUE")
1075+
enum_type = GraphQLEnumType("SomeEnum", colors)
1076+
assert enum_type.values == {
1077+
"RED": GraphQLEnumValue(1),
1078+
"BLUE": GraphQLEnumValue(2),
1079+
}
1080+
1081+
def defines_an_enum_using_values_of_a_python_enum():
1082+
colors = Enum("Colors", "RED BLUE")
1083+
enum_type = GraphQLEnumType("SomeEnum", colors, names_as_values=False)
1084+
assert enum_type.values == {
1085+
"RED": GraphQLEnumValue(1),
1086+
"BLUE": GraphQLEnumValue(2),
1087+
}
1088+
1089+
def defines_an_enum_using_names_of_a_python_enum():
1090+
colors = Enum("Colors", "RED BLUE")
1091+
enum_type = GraphQLEnumType("SomeEnum", colors, names_as_values=True)
1092+
assert enum_type.values == {
1093+
"RED": GraphQLEnumValue("RED"),
1094+
"BLUE": GraphQLEnumValue("BLUE"),
1095+
}
1096+
1097+
def defines_an_enum_using_members_of_a_python_enum():
1098+
colors = Enum("Colors", "RED BLUE")
1099+
enum_type = GraphQLEnumType("SomeEnum", colors, names_as_values=None)
1100+
assert enum_type.values == {
1101+
"RED": GraphQLEnumValue(colors.RED),
1102+
"BLUE": GraphQLEnumValue(colors.BLUE),
1103+
}
1104+
10601105
def defines_an_enum_type_with_a_description():
10611106
description = "nice enum"
10621107
enum_type = GraphQLEnumType(

0 commit comments

Comments
 (0)