Skip to main content

graphene-federation3

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)              
    
  • 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_federation3 import provides
        
        @provides
        class ArticleThatProvideAuthorAge(graphene.ObjectType):
            id = Int(required=True)
            text = String(required=True)
            author = provides(Field(User), fields='age')
    
import graphene
from graphene_federation3 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_federation3 import build_schema


class Query(graphene.ObjectType):
    ...
    pass


schema = build_schema(Query)  # add _service{sdl} field in Query
import graphene
from graphene_federation3 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, see entity.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:

  1. 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 before make test

Also, you can read about how we've come to federation at Preply here

Metadata

Release files for graphene-federation3 0.3.2.1659355218

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for graphene-federation3 0.3.2.1659355218
File Size Uploaded
graphene-federation3-0.3.2.1659355218.tar.gz 12.1 kB Details

Release files / graphene-federation3-0.3.2.1659355218.tar.gz

Download URL graphene-federation3-0.3.2.1659355218.tar.gz
Size 12.1 kB
Tags Source
SHA-256 checksum
How to use checksums
2a74cf158c2f2f60155f58a6ddab292f6432745670c411d2f0c62e56fbc89bf1
BLAKE2b-256 checksum
How to use checksums
cdd68e9e251fe470450134418c0c08e3c563cad28b2b94d5ab07f14ae4cf1373
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.9.13
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page