|
1 | 1 | from collections import OrderedDict, defaultdict
|
2 | 2 | from enum import Enum
|
3 | 3 | from functools import partial
|
| 4 | +from operator import itemgetter |
4 | 5 | from graphql.core.type import (
|
5 | 6 | GraphQLBoolean,
|
6 | 7 | GraphQLEnumType,
|
|
17 | 18 | )
|
18 | 19 | from graphql.core.type.definition import GraphQLType, get_named_type
|
19 | 20 | import six
|
20 |
| - |
21 | 21 | from .bases.class_type_creator import ClassTypeCreator
|
22 | 22 | from .bases.input_type import InputTypeBase
|
23 | 23 | from .bases.mutation import MutationBase
|
|
34 | 34 | from .utils.enum_to_graphql_enum import enum_to_graphql_enum
|
35 | 35 | from .utils.maybe_t import maybe_t
|
36 | 36 | from .utils.method_dispatch import method_dispatch
|
37 |
| -from .utils.thunk import AttributeTypeThunk, RootTypeThunk, ThunkList, TransformThunkList |
| 37 | +from .utils.thunk import AttributeTypeThunk, IdentityTypeThunk, RootTypeThunk, ThunkList, TransformThunkList |
38 | 38 |
|
39 | 39 | builtin_scalars = [
|
40 | 40 | GraphQLBoolean,
|
@@ -113,12 +113,22 @@ def _resolve_type(self, item):
|
113 | 113 | if not isinstance(item, str):
|
114 | 114 | item = maybe_t(item)
|
115 | 115 | assert isinstance(item, GraphQLType), \
|
116 |
| - 'Attempted to resolve an item {} that is not a GraphQLType'.format(item) |
| 116 | + 'Attempted to resolve an item "{}" that is not a GraphQLType'.format(item) |
| 117 | + |
| 118 | + named_type = get_named_type(item) |
| 119 | + known_type = self._registered_types.get(named_type.name) |
| 120 | + # Happens when we attempt to resolve an un-registered type. |
| 121 | + assert known_type and known_type not in self._reserved_names, \ |
| 122 | + 'Attempted to resolve a type "{}" that is not registered with this Registry.'.format(item) |
| 123 | + |
| 124 | + # Happens when we attempt to resolve a type that is already registered, but isn't the same type. |
| 125 | + assert known_type is named_type, \ |
| 126 | + 'Attempted to resolve a type "{}" that does not match the already registered type.'.format(item) |
117 | 127 |
|
118 | 128 | return item
|
119 | 129 |
|
120 | 130 | value = self._registered_types.get(item)
|
121 |
| - assert value, "Type {} was requested, but was not registered.".format(item) |
| 131 | + assert value, 'Type "{}" was requested, but was not registered.'.format(item) |
122 | 132 | return value
|
123 | 133 |
|
124 | 134 | def __getattr__(self, item):
|
@@ -266,14 +276,16 @@ def Mutations(self):
|
266 | 276 | if not self._mutations:
|
267 | 277 | raise TypeError("No mutations have been registered.")
|
268 | 278 |
|
269 |
| - mutations = OrderedDict() |
270 |
| - for k in sorted(self._mutations.keys()): |
271 |
| - mutations[k] = self._mutations[k]() |
| 279 | + existing_mutation_type = self._registered_types.get('Mutations') |
| 280 | + if existing_mutation_type: |
| 281 | + return IdentityTypeThunk(existing_mutation_type) |
272 | 282 |
|
273 |
| - return GraphQLObjectType( |
| 283 | + mutations = GraphQLObjectType( |
274 | 284 | name='Mutations',
|
275 |
| - fields=mutations |
| 285 | + fields=lambda: OrderedDict([(k, v()) for k, v in sorted(self._mutations.items(), key=itemgetter(0))]) |
276 | 286 | )
|
| 287 | + self._registered_types[mutations.name] = mutations |
| 288 | + return IdentityTypeThunk(mutations) |
277 | 289 |
|
278 | 290 | def _create_is_type_of(self, type):
|
279 | 291 | return partial(self._is_type_of, type)
|
|
0 commit comments