Skip to content

Commit 3fc5bb1

Browse files
committed
Add a getValues and getValue api to EnumType and allow None values
1 parent 5a92b57 commit 3fc5bb1

File tree

3 files changed

+52
-20
lines changed

3 files changed

+52
-20
lines changed

graphql/type/definition.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,12 @@ def __init__(self, name, values, description=None):
406406

407407
self.values = define_enum_values(self, values)
408408

409+
def getValues(self):
410+
return self.values
411+
412+
def getValue(self, name):
413+
return self._name_lookup.get(name)
414+
409415
def serialize(self, value):
410416
if isinstance(value, collections.Hashable):
411417
enum_value = self._value_lookup.get(value)
@@ -456,22 +462,28 @@ def define_enum_values(type, value_map):
456462
)
457463
value = copy.copy(value)
458464
value.name = value_name
459-
if value.value is None:
465+
if value.value == Undefined:
460466
value.value = value_name
461467

462468
values.append(value)
463469

464470
return values
465471

466472

473+
class Undefined(object):
474+
"""A representation of an Undefined value distinct from a None value"""
475+
pass
476+
477+
467478
class GraphQLEnumValue(object):
468-
__slots__ = 'name', 'value', 'deprecation_reason', 'description'
479+
__slots__ = 'name', 'value', 'is_deprecated', 'deprecation_reason', 'description'
469480

470-
def __init__(self, value=None, deprecation_reason=None, description=None, name=None):
481+
def __init__(self, value=Undefined, deprecation_reason=None, description=None, name=None):
471482
self.name = name
472483
self.value = value
473484
self.deprecation_reason = deprecation_reason
474485
self.description = description
486+
self.is_deprecated = bool(deprecation_reason)
475487

476488
def __eq__(self, other):
477489
return (

graphql/type/tests/test_definition.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,23 @@ def test_includes_nested_input_objects_in_the_map():
161161
assert schema.get_type_map()['NestedInputObject'] is NestedInputObject
162162

163163

164+
def test_includes_interface_possible_types_in_the_type_map():
165+
SomeInterface = GraphQLInterfaceType('SomeInterface', fields={'f': GraphQLField(GraphQLInt)})
166+
SomeSubtype = GraphQLObjectType(
167+
name='SomeSubtype',
168+
fields={'f': GraphQLField(GraphQLInt)},
169+
interfaces=[SomeInterface],
170+
is_type_of=lambda: None
171+
)
172+
schema = GraphQLSchema(
173+
query=GraphQLObjectType(
174+
name='Query',
175+
fields={
176+
'iface': GraphQLField(SomeInterface)}),
177+
types=[SomeSubtype])
178+
assert schema.get_type_map()['SomeSubtype'] == SomeSubtype
179+
180+
164181
def test_includes_interfaces_thunk_subtypes_in_the_type_map():
165182
SomeInterface = GraphQLInterfaceType(
166183
name='SomeInterface',
@@ -188,23 +205,6 @@ def test_includes_interfaces_thunk_subtypes_in_the_type_map():
188205
assert schema.get_type_map()['SomeSubtype'] is SomeSubtype
189206

190207

191-
def test_includes_interfaces_subtypes_in_the_type_map():
192-
SomeInterface = GraphQLInterfaceType('SomeInterface', fields={'f': GraphQLField(GraphQLInt)})
193-
SomeSubtype = GraphQLObjectType(
194-
name='SomeSubtype',
195-
fields={'f': GraphQLField(GraphQLInt)},
196-
interfaces=[SomeInterface],
197-
is_type_of=lambda: None
198-
)
199-
schema = GraphQLSchema(
200-
query=GraphQLObjectType(
201-
name='Query',
202-
fields={
203-
'iface': GraphQLField(SomeInterface)}),
204-
types=[SomeSubtype])
205-
assert schema.get_type_map()['SomeSubtype'] == SomeSubtype
206-
207-
208208
def test_stringifies_simple_types():
209209
assert str(GraphQLInt) == 'Int'
210210
assert str(BlogArticle) == 'Article'

graphql/type/tests/test_enum_type.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,26 @@ def test_enum_inputs_may_be_nullable():
212212
assert result.data == {'colorEnum': None, 'colorInt': None}
213213

214214

215+
def test_presents_a_getValues_api():
216+
values = ColorType.getValues()
217+
assert len(values) == 3
218+
assert values[0].name == 'RED'
219+
assert values[0].value == 0
220+
assert values[1].name == 'GREEN'
221+
assert values[1].value == 1
222+
assert values[2].name == 'BLUE'
223+
assert values[2].value == 2
224+
225+
226+
def test_presents_a_getValue_api():
227+
oneValue = ColorType.getValue('RED')
228+
assert oneValue.name == 'RED'
229+
assert oneValue.value == 0
230+
231+
badUsage = ColorType.getValue(0)
232+
assert badUsage is None
233+
234+
215235
def test_sorts_values_if_not_using_ordered_dict():
216236
enum = GraphQLEnumType(name='Test', values={
217237
'c': GraphQLEnumValue(),

0 commit comments

Comments
 (0)