@@ -51,8 +51,9 @@ def resolve_type(resolve_type_func, map, type_name, root, context, info):
51
51
52
52
class TypeMap (GraphQLTypeMap ):
53
53
54
- def __init__ (self , types , auto_camelcase = True ):
54
+ def __init__ (self , types , auto_camelcase = True , schema = None ):
55
55
self .auto_camelcase = auto_camelcase
56
+ self .schema = schema
56
57
super (TypeMap , self ).__init__ (types )
57
58
58
59
def reducer (self , map , type ):
@@ -72,21 +73,25 @@ def graphene_reducer(self, map, type):
72
73
if isinstance (_type , GrapheneGraphQLType ):
73
74
assert _type .graphene_type == type
74
75
return map
76
+
75
77
if issubclass (type , ObjectType ):
76
- return self .construct_objecttype (map , type )
78
+ internal_type = self .construct_objecttype (map , type )
77
79
if issubclass (type , InputObjectType ):
78
- return self .construct_inputobjecttype (map , type )
80
+ internal_type = self .construct_inputobjecttype (map , type )
79
81
if issubclass (type , Interface ):
80
- return self .construct_interface (map , type )
82
+ internal_type = self .construct_interface (map , type )
81
83
if issubclass (type , Scalar ):
82
- return self .construct_scalar (map , type )
84
+ internal_type = self .construct_scalar (map , type )
83
85
if issubclass (type , Enum ):
84
- return self .construct_enum (map , type )
86
+ internal_type = self .construct_enum (map , type )
85
87
if issubclass (type , Union ):
86
- return self .construct_union (map , type )
87
- return map
88
+ internal_type = self .construct_union (map , type )
89
+
90
+ return GraphQLTypeMap .reducer (map , internal_type )
88
91
89
92
def construct_scalar (self , map , type ):
93
+ # We have a mapping to the original GraphQL types
94
+ # so there are no collisions.
90
95
_scalars = {
91
96
String : GraphQLString ,
92
97
Int : GraphQLInt ,
@@ -95,18 +100,17 @@ def construct_scalar(self, map, type):
95
100
ID : GraphQLID
96
101
}
97
102
if type in _scalars :
98
- map [type ._meta .name ] = _scalars [type ]
99
- else :
100
- map [type ._meta .name ] = GrapheneScalarType (
101
- graphene_type = type ,
102
- name = type ._meta .name ,
103
- description = type ._meta .description ,
104
-
105
- serialize = getattr (type , 'serialize' , None ),
106
- parse_value = getattr (type , 'parse_value' , None ),
107
- parse_literal = getattr (type , 'parse_literal' , None ),
108
- )
109
- return map
103
+ return _scalars [type ]
104
+
105
+ return GrapheneScalarType (
106
+ graphene_type = type ,
107
+ name = type ._meta .name ,
108
+ description = type ._meta .description ,
109
+
110
+ serialize = getattr (type , 'serialize' , None ),
111
+ parse_value = getattr (type , 'parse_value' , None ),
112
+ parse_literal = getattr (type , 'parse_literal' , None ),
113
+ )
110
114
111
115
def construct_enum (self , map , type ):
112
116
values = OrderedDict ()
@@ -117,78 +121,76 @@ def construct_enum(self, map, type):
117
121
description = getattr (value , 'description' , None ),
118
122
deprecation_reason = getattr (value , 'deprecation_reason' , None )
119
123
)
120
- map [ type . _meta . name ] = GrapheneEnumType (
124
+ return GrapheneEnumType (
121
125
graphene_type = type ,
122
126
values = values ,
123
127
name = type ._meta .name ,
124
128
description = type ._meta .description ,
125
129
)
126
- return map
127
130
128
131
def construct_objecttype (self , map , type ):
129
132
if type ._meta .name in map :
130
133
_type = map [type ._meta .name ]
131
134
if isinstance (_type , GrapheneGraphQLType ):
132
135
assert _type .graphene_type == type
133
- return map
134
- map [type ._meta .name ] = GrapheneObjectType (
136
+ return _type
137
+
138
+ def interfaces ():
139
+ interfaces = []
140
+ for interface in type ._meta .interfaces :
141
+ i = self .construct_interface (map , interface )
142
+ interfaces .append (i )
143
+ return interfaces
144
+
145
+ return GrapheneObjectType (
135
146
graphene_type = type ,
136
147
name = type ._meta .name ,
137
148
description = type ._meta .description ,
138
- fields = None ,
149
+ fields = partial ( self . construct_fields_for_type , map , type ) ,
139
150
is_type_of = type .is_type_of ,
140
- interfaces = None
151
+ interfaces = interfaces
141
152
)
142
- interfaces = []
143
- for i in type ._meta .interfaces :
144
- map = self .reducer (map , i )
145
- interfaces .append (map [i ._meta .name ])
146
- map [type ._meta .name ]._provided_interfaces = interfaces
147
- map [type ._meta .name ]._fields = self .construct_fields_for_type (map , type )
148
- # self.reducer(map, map[type._meta.name])
149
- return map
150
153
151
154
def construct_interface (self , map , type ):
155
+ if type ._meta .name in map :
156
+ _type = map [type ._meta .name ]
157
+ if isinstance (_type , GrapheneInterfaceType ):
158
+ assert _type .graphene_type == type
159
+ return _type
160
+
152
161
_resolve_type = None
153
162
if type .resolve_type :
154
163
_resolve_type = partial (resolve_type , type .resolve_type , map , type ._meta .name )
155
- map [ type . _meta . name ] = GrapheneInterfaceType (
164
+ return GrapheneInterfaceType (
156
165
graphene_type = type ,
157
166
name = type ._meta .name ,
158
167
description = type ._meta .description ,
159
- fields = None ,
168
+ fields = partial ( self . construct_fields_for_type , map , type ) ,
160
169
resolve_type = _resolve_type ,
161
170
)
162
- map [type ._meta .name ]._fields = self .construct_fields_for_type (map , type )
163
- # self.reducer(map, map[type._meta.name])
164
- return map
165
171
166
172
def construct_inputobjecttype (self , map , type ):
167
- map [ type . _meta . name ] = GrapheneInputObjectType (
173
+ return GrapheneInputObjectType (
168
174
graphene_type = type ,
169
175
name = type ._meta .name ,
170
176
description = type ._meta .description ,
171
- fields = None ,
177
+ fields = partial ( self . construct_fields_for_type , map , type , is_input_type = True ) ,
172
178
)
173
- map [type ._meta .name ]._fields = self .construct_fields_for_type (map , type , is_input_type = True )
174
- return map
175
179
176
180
def construct_union (self , map , type ):
177
181
_resolve_type = None
178
182
if type .resolve_type :
179
183
_resolve_type = partial (resolve_type , type .resolve_type , map , type ._meta .name )
180
184
types = []
181
185
for i in type ._meta .types :
182
- map = self .construct_objecttype (map , i )
183
- types .append (map [ i . _meta . name ] )
184
- map [ type . _meta . name ] = GrapheneUnionType (
186
+ internal_type = self .construct_objecttype (map , i )
187
+ types .append (internal_type )
188
+ return GrapheneUnionType (
185
189
graphene_type = type ,
186
190
name = type ._meta .name ,
187
191
types = types ,
188
192
resolve_type = _resolve_type ,
189
193
)
190
- map [type ._meta .name ].types = types
191
- return map
192
194
193
195
def get_name (self , name ):
194
196
if self .auto_camelcase :
@@ -202,7 +204,7 @@ def construct_fields_for_type(self, map, type, is_input_type=False):
202
204
fields = OrderedDict ()
203
205
for name , field in type ._meta .fields .items ():
204
206
if isinstance (field , Dynamic ):
205
- field = get_field_as (field .get_type (), _as = Field )
207
+ field = get_field_as (field .get_type (self . schema ), _as = Field )
206
208
if not field :
207
209
continue
208
210
map = self .reducer (map , field .type )
0 commit comments