Package: graphql-core
GraphQL-core 3GraphQL-core 3 is a Python 3.6+ port ofGraphQL.js,
the JavaScript reference implementation forGraphQL,
a query language for APIs created by Facebook.The current version 3.2.3 of GraphQL-core is up-to-date with GraphQL.js version 16.6.0.An extensive test suite with over 2300 unit tests and 100% coverage comprises a
replication of the complete test suite of GraphQL.js, making sure this port is
reliable and compatible with GraphQL.js.Note that for various reasons, GraphQL-core does not use SemVer like GraphQL.js. Increases in the major version of GraphQL.js are reflected in the minor version of GraphQL-core instead. This means there can be breaking changes in the API when the minor version changes, and only patch releases are fully backward compatible. Therefore, we recommend something like=~ 3.2.0as version specifier when including GraphQL-core as a dependency.DocumentationA more detailed documentation for GraphQL-core 3 can be found atgraphql-core-3.readthedocs.io.The documentation for GraphQL.js can be found atgraphql.org/graphql-js/.The documentation for GraphQL itself can be found atgraphql.org.There will be alsoblog articleswith more usage
examples.Getting startedA general overview of GraphQL is available in theREADMEfor theSpecification for GraphQL. That overview
describes a simple set of GraphQL examples that exist astestsin this
repository. A good way to get started with this repository is to walk through that
README and the corresponding tests in parallel.InstallationGraphQL-core 3 can be installed from PyPI using the built-in pip command:python -m pip install graphql-coreYou can also usepoetryfor installation in a
virtual environment:poetry installUsageGraphQL-core provides two important capabilities: building a type schema and
serving queries against that type schema.First, build a GraphQL type schema which maps to your codebase:fromgraphqlimport(GraphQLSchema,GraphQLObjectType,GraphQLField,GraphQLString)schema=GraphQLSchema(query=GraphQLObjectType(name='RootQueryType',fields={'hello':GraphQLField(GraphQLString,resolve=lambdaobj,info:'world')}))This defines a simple schema, with one type and one field, that resolves to a fixed
value. Theresolvefunction can return a value, a co-routine object or a list of
these. It takes two positional arguments; the first one provides the root or the
resolved parent field, the second one provides aGraphQLResolveInfoobject which
contains information about the execution state of the query, including acontextattribute holding per-request state such as authentication information or database
session. Any GraphQL arguments are passed to theresolvefunctions as individual
keyword arguments.Note that the signature of the resolver functions is a bit different in GraphQL.js,
where the context is passed separately and arguments are passed as a single object.
Also note that GraphQL fields must be passed as aGraphQLFieldobject explicitly.
Similarly, GraphQL arguments must be passed asGraphQLArgumentobjects.A more complex example is included in the top-leveltestsdirectory.Then, serve the result of a query against that type schema.fromgraphqlimportgraphql_syncsource='{ hello }'print(graphql_sync(schema,source))This runs a query fetching the one field defined, and then prints the result:ExecutionResult(data={'hello':'world'},errors=None)Thegraphql_syncfunction will first ensure the query is syntactically and
semantically valid before executing it, reporting errors otherwise.fromgraphqlimportgraphql_syncsource='{ BoyHowdy }'print(graphql_sync(schema,source))Because we queried a non-existing field, we will get the following result:ExecutionResult(data=None,errors=[GraphQLError("Cannot query field 'BoyHowdy' on type 'RootQueryType'.",locations=[SourceLocation(line=1,column=3)])])Thegraphql_syncfunction assumes that all resolvers return values synchronously. By
using coroutines as resolvers, you can also create results in an asynchronous fashion
with thegraphqlfunction.importasynciofromgraphqlimport(graphql,GraphQLSchema,GraphQLObjectType,GraphQLField,GraphQLString)asyncdefresolve_hello(obj,info):awaitasyncio.sleep(3)return'world'schema=GraphQLSchema(query=GraphQLObjectType(name='RootQueryType',fields={'hello':GraphQLField(GraphQLString,resolve=resolve_hello)}))asyncdefmain():query='{ hello }'print('Fetching the result...')result=awaitgraphql(schema,query)print(result)asyncio.run(main())Goals and restrictionsGraphQL-core tries to reproduce the code of the reference implementation GraphQL.js
in Python as closely as possible and to stay up-to-date with the latest development of
GraphQL.js.GraphQL-core 3 (formerly known as GraphQL-core-next) has been created as a modern
alternative toGraphQL-core 2,
a prior work by Syrus Akbary, based on an older version of GraphQL.js and also
targeting older Python versions. Some parts of GraphQL-core 3 have been inspired by
GraphQL-core 2 or directly taken over with only slight modifications, but most of the
code has been re-implemented from scratch, replicating the latest code in GraphQL.js
very closely and adding type hints for Python.Design goals for the GraphQL-core 3 library were:to be a simple, cruft-free, state-of-the-art GraphQL implementation for current
Python versionsto be very close to the GraphQL.js reference implementation, while still providing
a Pythonic API and code styleto make extensive use of Python type hints, similar to how GraphQL.js used Flow
(and is now using TypeScript)to useblackto achieve a consistent code style
while saving time and mental energy for more important mattersto replicate the complete Mocha-based test suite of GraphQL.js
usingpytestwithpytest-describeSome restrictions (mostly in line with the design goals):requires Python 3.6 or newerdoes not support some already deprecated methods and options of GraphQL.jssupports asynchronous operations only via async.io
(does not support the additional executors in GraphQL-core)Integration with other libraries and roadmapGrapheneis a more high-level framework for building
GraphQL APIs in Python, and there is already a whole ecosystem of libraries, server
integrations and tools built on top of Graphene. Most of this Graphene ecosystem has
also been created by Syrus Akbary, who meanwhile has handed over the maintenance
and future development to members of the GraphQL-Python community.The current version 2 of Graphene is using Graphql-core 2 as core library for much of
the heavy lifting. Note that Graphene 2 is not compatible with GraphQL-core 3.
The  new version 3 of Graphene will use GraphQL-core 3 instead of GraphQL-core 2.Ariadneis a Python library for implementing
GraphQL servers using schema-first approach created by Mirumee Software.Ariadne is already using GraphQL-core 3 as its GraphQL implementation.Strawberry, created by Patrick
Arminio, is a new GraphQL library for Python 3, inspired by dataclasses,
that is also using GraphQL-core 3 as underpinning.ChangelogChanges are tracked asGitHub releases.Credits and historyThe GraphQL-core 3 libraryhas been created and is maintained by Christoph Zwerschkeuses ideas and code from GraphQL-core 2, a prior work by Syrus Akbaryis a Python port of GraphQL.js which has been developed by Lee Byron and others
at Facebook, Inc. and is now maintained
by theGraphQL foundationPlease watch the recording of Lee Byron's short keynote on thehistory of GraphQLat the open source leadership summit 2019 to better understand
how and why GraphQL was created at Facebook and then became open sourced
and ported to many different programming languages.LicenseGraphQL-core 3 isMIT-licensed,
just like GraphQL.js.