All Projects → graphql-python → Graphql Core

graphql-python / Graphql Core

Licence: mit
A Python 3.6+ port of the GraphQL.js reference implementation of GraphQL.

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to Graphql Core

Type Graphql
Create GraphQL schema and resolvers with TypeScript, using classes and decorators!
Stars: ✭ 6,864 (+1895.35%)
Mutual labels:  api, graphql, graphql-js
Typegql
Create GraphQL schema with TypeScript classes.
Stars: ✭ 415 (+20.64%)
Mutual labels:  api, graphql, graphql-js
Postgraphile
GraphQL is a new way of communicating with your server. It eliminates the problems of over- and under-fetching, incorporates strong data types, has built-in introspection, documentation and deprecation capabilities, and is implemented in many programming languages. This all leads to gloriously low-latency user experiences, better developer experiences, and much increased productivity. Because of all this, GraphQL is typically used as a replacement for (or companion to) RESTful API services.
Stars: ✭ 10,967 (+3088.08%)
Mutual labels:  api, graphql, graphql-js
Tartiflette
GraphQL Engine built with Python 3.6+ / asyncio
Stars: ✭ 719 (+109.01%)
Mutual labels:  api, graphql, asyncio
Graphql2rest
GraphQL to REST converter: automatically generate a RESTful API from your existing GraphQL API
Stars: ✭ 181 (-47.38%)
Mutual labels:  api, graphql, graphql-js
Tensei
🚀 Content management and distribution with a touch of elegance.
Stars: ✭ 217 (-36.92%)
Mutual labels:  api, graphql
Spectaql
Autogenerate static GraphQL API documentation
Stars: ✭ 198 (-42.44%)
Mutual labels:  api, graphql
Strapi Sdk Javascript
🔌 Official JavaScript SDK for APIs built with Strapi.
Stars: ✭ 247 (-28.2%)
Mutual labels:  api, graphql
Example Scalping
A working example algorithm for scalping strategy trading multiple stocks concurrently using python asyncio
Stars: ✭ 267 (-22.38%)
Mutual labels:  api, asyncio
Conventions
GraphQL Conventions Library for .NET
Stars: ✭ 198 (-42.44%)
Mutual labels:  api, graphql
Graphql To Mongodb
Allows for generic run-time generation of filter types for existing graphql types and parsing client requests to mongodb find queries
Stars: ✭ 261 (-24.13%)
Mutual labels:  graphql, graphql-js
Requester
Powerful, modern HTTP/REST client built on top of the Requests library
Stars: ✭ 273 (-20.64%)
Mutual labels:  api, graphql
Graphql Php
A PHP7 implementation of the GraphQL specification.
Stars: ✭ 217 (-36.92%)
Mutual labels:  api, graphql
Mercure
Server-sent live updates: protocol and reference implementation
Stars: ✭ 2,608 (+658.14%)
Mutual labels:  api, graphql
Templates
.NET project templates with batteries included, providing the minimum amount of code required to get you going faster.
Stars: ✭ 2,864 (+732.56%)
Mutual labels:  api, graphql
Fastapi Gino Arq Uvicorn
High-performance Async REST API, in Python. FastAPI + GINO + Arq + Uvicorn (w/ Redis and PostgreSQL).
Stars: ✭ 204 (-40.7%)
Mutual labels:  api, asyncio
Wp Graphql
🚀 GraphQL API for WordPress
Stars: ✭ 3,097 (+800.29%)
Mutual labels:  api, graphql
Vulcain
Fast and idiomatic client-driven REST APIs.
Stars: ✭ 3,190 (+827.33%)
Mutual labels:  api, graphql
Express Graphql Mongodb Boilerplate
A boilerplate for Node.js apps / GraphQL-API / Authentication from scratch - express, graphql - (graphql compose), mongodb (mongoose).
Stars: ✭ 288 (-16.28%)
Mutual labels:  api, graphql
Graphql Apis
📜 A collective list of public GraphQL APIs
Stars: ✭ 3,525 (+924.71%)
Mutual labels:  api, graphql

GraphQL-core 3

GraphQL-core 3 is a Python 3.6+ port of GraphQL.js, the JavaScript reference implementation for GraphQL, a query language for APIs created by Facebook.

PyPI version Documentation Status Build Status Coverage Status Dependency Updates Python 3 Status Code Style

The current version 3.1.3 of GraphQL-core is up-to-date with GraphQL.js version 15.2.0.

An extensive test suite with over 2200 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.

Documentation

A more detailed documentation for GraphQL-core 3 can be found at graphql-core-3.readthedocs.io.

The documentation for GraphQL.js can be found at graphql.org/graphql-js/.

The documentation for GraphQL itself can be found at graphql.org.

There will be also blog articles with more usage examples.

Getting started

An overview of GraphQL in general is available in the README for the Specification for GraphQL. That overview describes a simple set of GraphQL examples that exist as tests in this repository. A good way to get started with this repository is to walk through that README and the corresponding tests in parallel.

Installation

GraphQL-core 3 can be installed from PyPI using the built-in pip command:

python -m pip install "graphql-core>=3"

Alternatively, you can also use pipenv for installation in a virtual environment:

pipenv install "graphql-core>=3"

Usage

GraphQL-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 code base:

from graphql import (
    GraphQLSchema, GraphQLObjectType, GraphQLField, GraphQLString)

schema = GraphQLSchema(
    query=GraphQLObjectType(
        name='RootQueryType',
        fields={
            'hello': GraphQLField(
                GraphQLString,
                resolve=lambda obj, info: 'world')
        }))

This defines a simple schema with one type and one field, that resolves to a fixed value. The resolve function 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 a GraphQLResolveInfo object which contains information about the execution state of the query, including a context attribute holding per-request state such as authentication information or database session. Any GraphQL arguments are passed to the resolve functions 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 a GraphQLField object explicitly. Similarly, GraphQL arguments must be passed as GraphQLArgument objects.

A more complex example is included in the top level tests directory.

Then, serve the result of a query against that type schema.

from graphql import graphql_sync

query = '{ hello }'

print(graphql_sync(schema, query))

This runs a query fetching the one field defined, and then prints the result:

ExecutionResult(data={'hello': 'world'}, errors=None)

The graphql_sync function will first ensure the query is syntactically and semantically valid before executing it, reporting errors otherwise.

from graphql import graphql_sync

query = '{ BoyHowdy }'

print(graphql_sync(schema, query))

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)])])

The graphql_sync function assumes that all resolvers return values synchronously. By using coroutines as resolvers, you can also create results in an asynchronous fashion with the graphql function.

import asyncio
from graphql import (
    graphql, GraphQLSchema, GraphQLObjectType, GraphQLField, GraphQLString)


async def resolve_hello(obj, info):
    await asyncio.sleep(3)
    return 'world'

schema = GraphQLSchema(
    query=GraphQLObjectType(
        name='RootQueryType',
        fields={
            'hello': GraphQLField(
                GraphQLString,
                resolve=resolve_hello)
        }))


async def main():
    query = '{ hello }'
    print('Fetching the result...')
    result = await graphql(schema, query)
    print(result)


loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(main())
finally:
    loop.close()

Goals and restrictions

GraphQL-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 to GraphQL-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 are:

  • to be a simple, cruft-free, state-of-the-art implementation of GraphQL using current library and language versions
  • to be very close to the GraphQL.js reference implementation, while still using a Pythonic API and code style
  • to make extensive use of Python type hints, similar to how GraphQL.js makes uses Flow
  • to use black for automatic code formatting
  • to replicate the complete Mocha-based test suite of GraphQL.js using pytest

Some restrictions (mostly in line with the design goals):

  • requires Python 3.6 or newer
  • does not support some already deprecated methods and options of GraphQL.js
  • supports asynchronous operations only via async.io (does not support the additional executors in GraphQL-core)

Integration with other libraries and roadmap

  • Graphene is 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.

  • Ariadne is 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.

Changelog

Changes are tracked as GitHub releases.

Credits and history

The GraphQL-core 3 library

  • has been created and is maintained by Christoph Zwerschke
  • uses ideas and code from GraphQL-core 2, a prior work by Syrus Akbary
  • is a Python port of GraphQL.js which has been developed by Lee Byron and others at Facebook, Inc. and is now maintained by the GraphQL foundation

Please watch the recording of Lee Byron's short keynote on the history of GraphQL at 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.

License

GraphQL-core 3 is MIT-licensed, just like GraphQL.js.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].