Set of scripts and helper utilities to extend Ariadne GraphQL library
Project description
Ariadne Extensions
Set of scripts and helper utilities to extend Ariadne GraphQL library
Install
pip install ariadne-extensions
Features
Federation support
Support for Federation Specification
Features
- Generate federation schema types and directives (
_Any
,_FieldSet
, ...) - Implements
{_service{sdl}}
query - Detects boundary types and generates
_Entities
union - Implements resolve reference helpers for boundary types queried over
{_entities}
query (resolve_reference
andresolve_references
decorators)
Documentation
ariadne_extensions.federation.FederatedManager
FederatedManager
is a class responsible for creating and executable schema that complies with Federation Specification. Similar to what make_executable_schema
does with ordinary schema file.
Create a FederatedManager instance passing in path to your schema file and QueryType instance. Manager needs to query_type to register _entities
and _service
resolvers.
query_type = QueryType()
manager = federation.FederatedManager(
schema_sdl_file='/some/path/schema.graphql',
query=query_type,
)
Register any other ObjectType
s and resolvers by either calling and add_types
method, or by extending manager.types
list.
photo_type = ObjectType('Photo')
thumbnail_type = ObjectType('Thumbnail')
manager.add_types(photo_type, thumbnail_type)
manager.types.append(snake_case_fallback_resolvers)
Finally, get a combiled schema. This compiled schema will extend types defined in '/some/path/schema.graphql' with directives, types and queries, that required by Federation Specification protocol.
schema = manager.get_schema()
ariadne_extensions.federation.FederatedObjectType
If you are using GraphQL Federation, your service schema probably implements some so called "boundary objects". That's where FederatedObjectType
is useful.
FederatedObjectType
implements resolve_reference
and resolve_references
decorator. Those are used to register functions, that will be called when a federation gateway calls {_entities{}}
query.
Let's say User
is a boundary type, with a single id
key. You need to implement a function, that will accept a dictionary of keys ({'id': ...} in our example
) and return a User
instance.
FederatedManager will call this function for every _entities([{__typename: 'User', id: ...}])
query.
user_type = federation.FederatedObjectType('User')
@user_type.resolve_reference
def resolve_user_reference(representation, obj, info):
user_id = representation.get('id')
return get_user_by_id(user_id)
FederatedObjectType
extends Ariadne's ObjectType
. You can still use the field
decorator, set_alias
method and others as in regular ObjectType
, and others.
@user_type.field('name')
def resolve_billing_account(obj, *_, id):
return f'{obj.first_name} {obj_last_name}'
Don't forget to add user_type
to our manager.
manager.add_types(user_type)
Example
type User @key(fields: "id") @extends {
id: ID! @external
photos: [Photo]!
}
type Photo {
id: ID!
url: String!
description: String
}
from os.path import dirname, join
from ariadne import QueryType, ObjectType, snake_case_fallback_resolvers
from ariadne_extensions import federation
query_type = QueryType()
manager = federation.FederatedManager(
schema_sdl_file=join(dirname(__file__), 'schema.graphql'),
query=query_type,
)
user_type = federation.FederatedObjectType('User')
photo_type = ObjectType('Photo')
@user_type.resolve_reference
def resolve_user_reference(representation, obj, info):
user_id = representation.get('id')
return get_user_by_id(user_id)
@user_type.field('name')
def resolve_billing_account(obj, *_, id):
return f'{obj.first_name} {obj_last_name}'
manager.add_types(user_type, photo_type)
manager.add_types(snake_case_fallback_resolvers)
schema = manager.get_schema()
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file ariadne-extensions-0.1.7.tar.gz
.
File metadata
- Download URL: ariadne-extensions-0.1.7.tar.gz
- Upload date:
- Size: 4.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.1 importlib_metadata/3.7.3 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.7.10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7d041d8674a985f33464852544bbe28407e4265642f50572d3f22b835ccd5dc5 |
|
MD5 | f75c02ed2a1bd40f2461463d43588891 |
|
BLAKE2b-256 | e777686eac1aebdd7fc8c238566bc4ccb0b4680b9d4ad9e5864b5f6be0590df2 |