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
- provides # to annotate the expected returned fieldset from a field on a base type that is guaranteed to be selectable by the gateway.
- Base class should be decorated with
@provides
as well as field on a base type that provides. Check example bellow:
import graphene from graphene_federation import provides @provides class ArticleThatProvideAuthorAge(graphene.ObjectType): id = Int(required=True) text = String(required=True) author = provides(Field(User), fields='age')
- Base class should be decorated with
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
Also, you can read about how we've come to federation at Preply here
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Filename, size | File type | Python version | Upload date | Hashes |
---|---|---|---|---|
Filename, size graphene-federation-0.1.0.tar.gz (21.1 MB) | File type Source | Python version None | Upload date | Hashes View |
Close
Hashes for graphene-federation-0.1.0.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | e44e8e354d0c8eeb03547d5c262d01c868d4ea7d1458512c994176eed80fd2bf |
|
MD5 | d106ae5dbb57873494acaf2ce619ecc5 |
|
BLAKE2-256 | b205de1f007b397bd868f6306e718afe862bab12dd66cc69f05b5c8f8fc69b5e |