Skip to content

Commit 572fdca

Browse files
committed
Introspection's object types/enums should be using OrderedDicts for their fields/values, that way the order in the schema printer is going to be consistent.
1 parent 527ff70 commit 572fdca

File tree

2 files changed

+679
-615
lines changed

2 files changed

+679
-615
lines changed

graphql/core/type/introspection.py

Lines changed: 170 additions & 154 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from collections import OrderedDict
12
from ..language.printer import print_ast
23
from ..utils.ast_from_value import ast_from_value
34
from .definition import (
@@ -21,67 +22,83 @@
2122
'server. It exposes all available types and directives on '
2223
'the server, as well as the entry points for query and '
2324
'mutation operations.',
24-
fields=lambda: {
25-
'types': GraphQLField(
25+
fields=lambda: OrderedDict([
26+
('types', GraphQLField(
2627
description='A list of all types supported by this server.',
2728
type=GraphQLNonNull(GraphQLList(GraphQLNonNull(__Type))),
2829
resolver=lambda schema, *_: schema.get_type_map().values(),
29-
),
30-
'queryType': GraphQLField(
30+
)),
31+
('queryType', GraphQLField(
3132
description='The type that query operations will be rooted at.',
3233
type=GraphQLNonNull(__Type),
3334
resolver=lambda schema, *_: schema.get_query_type(),
34-
),
35-
'mutationType': GraphQLField(
35+
)),
36+
('mutationType', GraphQLField(
3637
description='If this server supports mutation, the type that '
3738
'mutation operations will be rooted at.',
3839
type=__Type,
3940
resolver=lambda schema, *_: schema.get_mutation_type(),
40-
),
41-
'directives': GraphQLField(
41+
)),
42+
('directives', GraphQLField(
4243
description='A list of all directives supported by this server.',
4344
type=GraphQLNonNull(GraphQLList(GraphQLNonNull(__Directive))),
4445
resolver=lambda schema, *_: schema.get_directives(),
45-
),
46-
})
46+
)),
47+
]))
4748

48-
__Directive = GraphQLObjectType('__Directive', lambda: {
49-
'name': GraphQLField(GraphQLNonNull(GraphQLString)),
50-
'description': GraphQLField(GraphQLString),
51-
'args': GraphQLField(
52-
type=GraphQLNonNull(GraphQLList(GraphQLNonNull(__InputValue))),
53-
resolver=lambda directive, *args: directive.args or [],
54-
),
55-
'onOperation': GraphQLField(
56-
type=GraphQLBoolean,
57-
resolver=lambda directive, *args: directive.on_operation,
58-
),
59-
'onFragment': GraphQLField(
60-
type=GraphQLBoolean,
61-
resolver=lambda directive, *args: directive.on_fragment,
62-
),
63-
'onField': GraphQLField(
64-
type=GraphQLBoolean,
65-
resolver=lambda directive, *args: directive.on_field,
66-
),
67-
})
49+
__Directive = GraphQLObjectType(
50+
'__Directive',
51+
fields=lambda: OrderedDict([
52+
('name', GraphQLField(GraphQLNonNull(GraphQLString))),
53+
('description', GraphQLField(GraphQLString)),
54+
('args', GraphQLField(
55+
type=GraphQLNonNull(GraphQLList(GraphQLNonNull(__InputValue))),
56+
resolver=lambda directive, *args: directive.args or [],
57+
)),
58+
('onOperation', GraphQLField(
59+
type=GraphQLNonNull(GraphQLBoolean),
60+
resolver=lambda directive, *args: directive.on_operation,
61+
)),
62+
('onFragment', GraphQLField(
63+
type=GraphQLNonNull(GraphQLBoolean),
64+
resolver=lambda directive, *args: directive.on_fragment,
65+
)),
66+
('onField', GraphQLField(
67+
type=GraphQLNonNull(GraphQLBoolean),
68+
resolver=lambda directive, *args: directive.on_field,
69+
))
70+
]))
71+
72+
73+
class TypeKind(object):
74+
SCALAR = 0
75+
OBJECT = 1
76+
INTERFACE = 2
77+
UNION = 3
78+
ENUM = 4
79+
INPUT_OBJECT = 5
80+
LIST = 6
81+
NON_NULL = 7
6882

6983

7084
class TypeFieldResolvers(object):
71-
@staticmethod
72-
def kind(type, *_):
73-
for cls, kind in (
74-
(GraphQLScalarType, TypeKind.SCALAR),
75-
(GraphQLObjectType, TypeKind.OBJECT),
76-
(GraphQLInterfaceType, TypeKind.INTERFACE),
77-
(GraphQLUnionType, TypeKind.UNION),
78-
(GraphQLEnumType, TypeKind.ENUM),
79-
(GraphQLInputObjectType, TypeKind.INPUT_OBJECT),
80-
(GraphQLList, TypeKind.LIST),
81-
(GraphQLNonNull, TypeKind.NON_NULL),
82-
):
83-
if isinstance(type, cls):
85+
_kinds = (
86+
(GraphQLScalarType, TypeKind.SCALAR),
87+
(GraphQLObjectType, TypeKind.OBJECT),
88+
(GraphQLInterfaceType, TypeKind.INTERFACE),
89+
(GraphQLUnionType, TypeKind.UNION),
90+
(GraphQLEnumType, TypeKind.ENUM),
91+
(GraphQLInputObjectType, TypeKind.INPUT_OBJECT),
92+
(GraphQLList, TypeKind.LIST),
93+
(GraphQLNonNull, TypeKind.NON_NULL),
94+
)
95+
96+
@classmethod
97+
def kind(cls, type, *_):
98+
for klass, kind in cls._kinds:
99+
if isinstance(type, klass):
84100
return kind
101+
85102
raise Exception('Unknown kind of type: {}'.format(type))
86103

87104
@staticmethod
@@ -116,149 +133,148 @@ def input_fields(type, *_):
116133
if isinstance(type, GraphQLInputObjectType):
117134
return type.get_fields().values()
118135

119-
__Type = GraphQLObjectType('__Type', lambda: {
120-
'kind': GraphQLField(
121-
type=GraphQLNonNull(__TypeKind),
122-
resolver=TypeFieldResolvers.kind
123-
),
124-
'name': GraphQLField(GraphQLString),
125-
'description': GraphQLField(GraphQLString),
126-
'fields': GraphQLField(
127-
type=GraphQLList(GraphQLNonNull(__Field)),
128-
args={
129-
'includeDeprecated': GraphQLArgument(
130-
GraphQLBoolean,
131-
default_value=False
132-
)
133-
},
134-
resolver=TypeFieldResolvers.fields
135-
),
136-
'interfaces': GraphQLField(
137-
type=GraphQLList(GraphQLNonNull(__Type)),
138-
resolver=TypeFieldResolvers.interfaces
139-
),
140-
'possibleTypes': GraphQLField(
141-
type=GraphQLList(GraphQLNonNull(__Type)),
142-
resolver=TypeFieldResolvers.possible_types
143-
),
144-
'enumValues': GraphQLField(
145-
type=GraphQLList(GraphQLNonNull(__EnumValue)),
146-
args={
147-
'includeDeprecated': GraphQLArgument(
148-
GraphQLBoolean,
149-
default_value=False
150-
)
151-
},
152-
resolver=TypeFieldResolvers.enum_values
153-
),
154-
'inputFields': GraphQLField(
155-
type=GraphQLList(GraphQLNonNull(__InputValue)),
156-
resolver=TypeFieldResolvers.input_fields
157-
),
158-
'ofType': GraphQLField(
159-
type=__Type,
160-
resolver=lambda type, *_: getattr(type, 'of_type', None)
161-
),
162-
})
163136

164-
__Field = GraphQLObjectType('__Field', lambda: {
165-
'name': GraphQLField(GraphQLNonNull(GraphQLString)),
166-
'description': GraphQLField(GraphQLString),
167-
'args': GraphQLField(
168-
type=GraphQLNonNull(GraphQLList(GraphQLNonNull(__InputValue))),
169-
resolver=lambda field, *_: field.args or []
170-
),
171-
'type': GraphQLField(GraphQLNonNull(__Type)),
172-
'isDeprecated': GraphQLField(
173-
type=GraphQLNonNull(GraphQLBoolean),
174-
resolver=lambda field, *_: bool(field.deprecation_reason)
175-
),
176-
'deprecationReason': GraphQLField(
177-
type=GraphQLString,
178-
resolver=lambda field, *_: field.deprecation_reason
179-
)
180-
})
137+
__Type = GraphQLObjectType(
138+
'__Type',
139+
fields=lambda: OrderedDict([
140+
('kind', GraphQLField(
141+
type=GraphQLNonNull(__TypeKind),
142+
resolver=TypeFieldResolvers.kind
143+
)),
144+
('name', GraphQLField(GraphQLString)),
145+
('description', GraphQLField(GraphQLString)),
146+
('fields', GraphQLField(
147+
type=GraphQLList(GraphQLNonNull(__Field)),
148+
args={
149+
'includeDeprecated': GraphQLArgument(
150+
GraphQLBoolean,
151+
default_value=False
152+
)
153+
},
154+
resolver=TypeFieldResolvers.fields
155+
)),
156+
('interfaces', GraphQLField(
157+
type=GraphQLList(GraphQLNonNull(__Type)),
158+
resolver=TypeFieldResolvers.interfaces
159+
)),
160+
('possibleTypes', GraphQLField(
161+
type=GraphQLList(GraphQLNonNull(__Type)),
162+
resolver=TypeFieldResolvers.possible_types
163+
)),
164+
('enumValues', GraphQLField(
165+
type=GraphQLList(GraphQLNonNull(__EnumValue)),
166+
args={
167+
'includeDeprecated': GraphQLArgument(
168+
GraphQLBoolean,
169+
default_value=False
170+
)
171+
},
172+
resolver=TypeFieldResolvers.enum_values
173+
)),
174+
('inputFields', GraphQLField(
175+
type=GraphQLList(GraphQLNonNull(__InputValue)),
176+
resolver=TypeFieldResolvers.input_fields
177+
)),
178+
('ofType', GraphQLField(
179+
type=__Type,
180+
resolver=lambda type, *_: getattr(type, 'of_type', None)
181+
)),
182+
]))
183+
184+
__Field = GraphQLObjectType(
185+
'__Field',
186+
fields=lambda: OrderedDict([
187+
('name', GraphQLField(GraphQLNonNull(GraphQLString))),
188+
('description', GraphQLField(GraphQLString)),
189+
('args', GraphQLField(
190+
type=GraphQLNonNull(GraphQLList(GraphQLNonNull(__InputValue))),
191+
resolver=lambda field, *_: field.args or []
192+
)),
193+
('type', GraphQLField(GraphQLNonNull(__Type))),
194+
('isDeprecated', GraphQLField(
195+
type=GraphQLNonNull(GraphQLBoolean),
196+
resolver=lambda field, *_: bool(field.deprecation_reason)
197+
)),
198+
('deprecationReason', GraphQLField(
199+
type=GraphQLString,
200+
resolver=lambda field, *_: field.deprecation_reason
201+
))
202+
])
203+
)
181204

182-
__InputValue = GraphQLObjectType('__InputValue', lambda: {
183-
'name': GraphQLField(GraphQLNonNull(GraphQLString)),
184-
'description': GraphQLField(GraphQLString),
185-
'type': GraphQLField(GraphQLNonNull(__Type)),
186-
'defaultValue': GraphQLField(
187-
type=GraphQLString,
188-
resolver=lambda input_val, *_:
205+
__InputValue = GraphQLObjectType(
206+
'__InputValue',
207+
fields=lambda: OrderedDict([
208+
('name', GraphQLField(GraphQLNonNull(GraphQLString))),
209+
('description', GraphQLField(GraphQLString)),
210+
('type', GraphQLField(GraphQLNonNull(__Type))),
211+
('defaultValue', GraphQLField(
212+
type=GraphQLString,
213+
resolver=lambda input_val, *_:
189214
None if input_val.default_value is None
190215
else print_ast(ast_from_value(input_val.default_value, input_val))
191-
)
192-
})
216+
))
217+
]))
193218

194-
__EnumValue = GraphQLObjectType('__EnumValue', lambda: {
195-
'name': GraphQLField(GraphQLNonNull(GraphQLString)),
196-
'description': GraphQLField(GraphQLString),
197-
'isDeprecated': GraphQLField(
198-
type=GraphQLNonNull(GraphQLBoolean),
199-
resolver=lambda field, *_: bool(field.deprecation_reason)
200-
),
201-
'deprecationReason': GraphQLField(
202-
type=GraphQLString,
203-
resolver=lambda enum_value, *_: enum_value.deprecation_reason,
204-
)
205-
})
206-
207-
208-
class TypeKind(object):
209-
SCALAR = 0
210-
OBJECT = 1
211-
INTERFACE = 2
212-
UNION = 3
213-
ENUM = 4
214-
INPUT_OBJECT = 5
215-
LIST = 6
216-
NON_NULL = 7
219+
__EnumValue = GraphQLObjectType(
220+
'__EnumValue',
221+
fields=lambda: OrderedDict([
222+
('name', GraphQLField(GraphQLNonNull(GraphQLString))),
223+
('description', GraphQLField(GraphQLString)),
224+
('isDeprecated', GraphQLField(
225+
type=GraphQLNonNull(GraphQLBoolean),
226+
resolver=lambda field, *_: bool(field.deprecation_reason)
227+
)),
228+
('deprecationReason', GraphQLField(
229+
type=GraphQLString,
230+
resolver=lambda enum_value, *_: enum_value.deprecation_reason,
231+
))
232+
]))
217233

218234
__TypeKind = GraphQLEnumType(
219235
'__TypeKind',
220236
description='An enum describing what kind of type a given __Type is',
221-
values={
222-
'SCALAR': GraphQLEnumValue(
237+
values=OrderedDict([
238+
('SCALAR', GraphQLEnumValue(
223239
TypeKind.SCALAR,
224240
description='Indicates this type is a scalar.'
225-
),
226-
'OBJECT': GraphQLEnumValue(
241+
)),
242+
('OBJECT', GraphQLEnumValue(
227243
TypeKind.OBJECT,
228244
description='Indicates this type is an object. '
229245
'`fields` and `interfaces` are valid fields.'
230-
),
231-
'INTERFACE': GraphQLEnumValue(
246+
)),
247+
('INTERFACE', GraphQLEnumValue(
232248
TypeKind.INTERFACE,
233249
description='Indicates this type is an interface. '
234250
'`fields` and `possibleTypes` are valid fields.'
235-
),
236-
'UNION': GraphQLEnumValue(
251+
)),
252+
('UNION', GraphQLEnumValue(
237253
TypeKind.UNION,
238254
description='Indicates this type is a union. '
239255
'`possibleTypes` is a valid field.'
240-
),
241-
'ENUM': GraphQLEnumValue(
256+
)),
257+
('ENUM', GraphQLEnumValue(
242258
TypeKind.ENUM,
243259
description='Indicates this type is an enum. '
244260
'`enumValues` is a valid field.'
245-
),
246-
'INPUT_OBJECT': GraphQLEnumValue(
261+
)),
262+
('INPUT_OBJECT', GraphQLEnumValue(
247263
TypeKind.INPUT_OBJECT,
248264
description='Indicates this type is an input object. '
249265
'`inputFields` is a valid field.'
250-
),
251-
'LIST': GraphQLEnumValue(
266+
)),
267+
('LIST', GraphQLEnumValue(
252268
TypeKind.LIST,
253269
description='Indicates this type is a list. '
254270
'`ofType` is a valid field.'
255-
),
256-
'NON_NULL': GraphQLEnumValue(
271+
)),
272+
('NON_NULL', GraphQLEnumValue(
257273
TypeKind.NON_NULL,
258274
description='Indicates this type is a non-null. '
259275
'`ofType` is a valid field.'
260-
),
261-
})
276+
)),
277+
]))
262278

263279
IntrospectionSchema = __Schema
264280

0 commit comments

Comments
 (0)