Federation implementation for graphene
Project description
graphene-federation
Federation support for graphene
Federation specs implementation on top of Python graphene lib https://www.apollographql.com/docs/apollo-server/federation/federation-spec/
Based on discussion: https://github.com/graphql-python/graphene/issues/953#issuecomment-508481652
Supports now:
- sdl (_service fields) # make possible to add schema in federation (as is)
@key
decorator (entity support) # to perform Queries across service boundaries- You can use multiple
@key
per each ObjectType
@key('id') @key('email') class User(ObjectType): id = Int(required=True) email = String() def __resolve_reference(self, info, **kwargs): if self.id is not None: return User(id=self.id, email=f'name_{self.id}@gmail.com') return User(id=123, email=self.email)
- You can use multiple
- extend # extend remote types
- external # mark field as external
- requires # mark that field resolver requires other fields to be pre-fetched
Todo implement:
- @provides
import graphene
from graphene_federation import build_schema, key
@key(fields='id') # mark File as Entity and add in EntityUnion https://www.apollographql.com/docs/apollo-server/federation/federation-spec/#key
class File(graphene.ObjectType):
id = graphene.Int(required=True)
name = graphene.String()
def resolve_id(self, info, **kwargs):
return 1
def resolve_name(self, info, **kwargs):
return self.name
def __resolve_reference(self, info, **kwargs): # https://www.apollographql.com/docs/apollo-server/api/apollo-federation/#__resolvereference
return get_file_by_id(self.id)
import graphene
from graphene_federation import build_schema
class Query(graphene.ObjectType):
...
pass
schema = build_schema(Query) # add _service{sdl} field in Query
import graphene
from graphene_federation import external, extend
@extend(fields='id')
class Message(graphene.ObjectType):
id = external(graphene.Int(required=True))
def resolve_id(self, **kwargs):
return 1
__resolve_reference
- Each type which is decorated with
@key
or@extend
is added to_Entity
union __resolve_reference
method can be defined for each type that is an entity. This method is called whenever an entity is requested as part of the fulfilling a query plan. If not explicitly defined, default resolver is used. Default resolver just creates instance of type with passed fieldset as kwargs, seeentity.get_entity_query
for more details- You should define
__resolve_reference
, if you need to extract object before passing it to fields resolvers (example: FileNode) - You should not define
__resolve_reference
, if fileds resolvers need only data passed in fieldset (example: FunnyText) - read more in official documentation
Known issues:
- decorators will not work properly
- on fields with capitalised letters with
auto_camelcase=True
, for example:my_ABC_field = String()
- on fields with custom names for example
some_field = String(name='another_name')
For more details see examples
Or better check integration_tests
Also cool example of integration with Mongoengine
For contribution:
Run tests:
make test
- if you've changed Dockerfile or requirements run
make build
beforemake test
Project details
Release history Release notifications | RSS feed
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 graphene-federation-0.0.5.tar.gz
.
File metadata
- Download URL: graphene-federation-0.0.5.tar.gz
- Upload date:
- Size: 5.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.18.4 setuptools/38.5.1 requests-toolbelt/0.9.1 tqdm/4.33.0 CPython/2.7.15+
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2a5495d5d57636545f324bb296f85f4a24f5f27994aeee71cba52fc1f0b5bb4a |
|
MD5 | f30488ee985c0a4a54d1a4101f958c30 |
|
BLAKE2b-256 | abd13f296955c9e36ba4a6831461c632ea0b0e19619b69aaa47fdeff8f8ba52f |