Federation implementation for graphene
Project description
graphene-federation
Federation support for graphene
Draft version, of federation specs implementation on top of Python graphene lib https://www.apollographql.com/docs/apollo-server/federation/federation-spec/
Use at your own risk
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
Todo implement:
- @requires
- @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
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
Close
Hashes for graphene-federation-0.0.4.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 529d52da2b5ce9d83f68dd37ef6c4224904aded00d5e4eaf5f044765eac6be8a |
|
MD5 | 087d0ca174ab63d4049e857932185797 |
|
BLAKE2b-256 | b58ba96a6c7d082e455f181223e9b9cbc269cc62a97401051a03ae3d369e573d |