|
7 | 7 | graphql,
|
8 | 8 | graphql_sync,
|
9 | 9 | introspection_types,
|
| 10 | + parse, |
10 | 11 | print_schema,
|
| 12 | + subscribe, |
11 | 13 | GraphQLArgument,
|
12 | 14 | GraphQLBoolean,
|
13 | 15 | GraphQLEnumValue,
|
@@ -309,20 +311,52 @@ def create_fields_for_type(self, graphene_type, is_input_type=False):
|
309 | 311 | if isinstance(arg.type, NonNull)
|
310 | 312 | else arg.default_value,
|
311 | 313 | )
|
312 |
| - resolve = field.get_resolver( |
313 |
| - self.get_resolver(graphene_type, name, field.default_value) |
314 |
| - ) |
315 | 314 | _field = GraphQLField(
|
316 | 315 | field_type,
|
317 | 316 | args=args,
|
318 |
| - resolve=resolve, |
| 317 | + resolve=field.get_resolver( |
| 318 | + self.get_resolver_for_type( |
| 319 | + graphene_type, "resolve_{}", name, field.default_value |
| 320 | + ) |
| 321 | + ), |
| 322 | + subscribe=field.get_resolver( |
| 323 | + self.get_resolver_for_type( |
| 324 | + graphene_type, "subscribe_{}", name, field.default_value |
| 325 | + ) |
| 326 | + ), |
319 | 327 | deprecation_reason=field.deprecation_reason,
|
320 | 328 | description=field.description,
|
321 | 329 | )
|
322 | 330 | field_name = field.name or self.get_name(name)
|
323 | 331 | fields[field_name] = _field
|
324 | 332 | return fields
|
325 | 333 |
|
| 334 | + def get_resolver_for_type(self, graphene_type, pattern, name, default_value): |
| 335 | + if not issubclass(graphene_type, ObjectType): |
| 336 | + return |
| 337 | + func_name = pattern.format(name) |
| 338 | + resolver = getattr(graphene_type, func_name, None) |
| 339 | + if not resolver: |
| 340 | + # If we don't find the resolver in the ObjectType class, then try to |
| 341 | + # find it in each of the interfaces |
| 342 | + interface_resolver = None |
| 343 | + for interface in graphene_type._meta.interfaces: |
| 344 | + if name not in interface._meta.fields: |
| 345 | + continue |
| 346 | + interface_resolver = getattr(interface, func_name, None) |
| 347 | + if interface_resolver: |
| 348 | + break |
| 349 | + resolver = interface_resolver |
| 350 | + |
| 351 | + # Only if is not decorated with classmethod |
| 352 | + if resolver: |
| 353 | + return get_unbound_function(resolver) |
| 354 | + |
| 355 | + default_resolver = ( |
| 356 | + graphene_type._meta.default_resolver or get_default_resolver() |
| 357 | + ) |
| 358 | + return partial(default_resolver, name, default_value) |
| 359 | + |
326 | 360 | def resolve_type(self, resolve_type_func, type_name, root, info, _type):
|
327 | 361 | type_ = resolve_type_func(root, info)
|
328 | 362 |
|
@@ -468,6 +502,11 @@ async def execute_async(self, *args, **kwargs):
|
468 | 502 | kwargs = normalize_execute_kwargs(kwargs)
|
469 | 503 | return await graphql(self.graphql_schema, *args, **kwargs)
|
470 | 504 |
|
| 505 | + async def subscribe(self, query, *args, **kwargs): |
| 506 | + document = parse(query) |
| 507 | + kwargs = normalize_execute_kwargs(kwargs) |
| 508 | + return await subscribe(self.graphql_schema, document, *args, **kwargs) |
| 509 | + |
471 | 510 | def introspect(self):
|
472 | 511 | introspection = self.execute(introspection_query)
|
473 | 512 | if introspection.errors:
|
|
0 commit comments