Generate fully typed GraphQL client from schema, queries and mutations!
Project description
Ariadne Code Generator
Python code generator that takes graphql schema, queries and mutations and generates Python package with fully typed and asynchronous GraphQL client.
It's available as ariadne-codegen command and reads configuration from the pyproject.toml file:
$ ariadne-codegen
Features
- Generate pydantic models from schema types, inputs and enums.
- Generate pydantic models for GraphQL results.
- Generate client package with each GraphQL operation available as async method.
Installation
Ariadne Code Generator can be installed with pip:
$ pip install ariadne-codegen
Configuration
ariadne-codegen reads configuration from [ariadne-codegen] section in your pyproject.toml'.
Required settings:
queries_path- path to file/directory with queries
One of the following 2 parameters is required, in case of providing both of them schema_path is prioritized:
schema_path- path to file/directory with graphql schemaremote_schema_url- url to graphql server, where introspection query can be perfomed
Optional settings:
remote_schema_headers- extra headers that are passed along with introspection query, eg.{"Authorization" = "Bearer: token"}target_package_name(defaults to"graphql_client") - name of generated packagetarget_package_path(defaults to cwd) - path where to generate packageclient_name(defaults to"Client") - name of generated client classclient_file_name(defaults to"client") - name of file with generated client classbase_client_name(defaults to"AsyncBaseClient") - name of base client classbase_client_file_path(defaults to.../graphql_sdk_gen/generators/async_base_client.py) - path to file wherebase_client_nameis definedenums_module_name(defaults to"enums") - name of file with generated enums modelsinput_types_module_name(defaults to"input_types") - name of file with generated input types modelsinclude_comments(defaults totrue) - a flag that specifies whether to include comments in generated filesconvert_to_snake_case(defaults totrue) - a flag that specifies whether to convert fields and arguments names to snake caseasync_client(defaults totrue) - default generated client isasync, change this to optionfalseto generate synchronous client insteadfiles_to_include(defaults to[]) - list of files which will be copied into generated package
Using generated client
Generated client can be imported from package:
from {target_package_name}.{client_file_name} import {client_name}
Example with default settings:
from graphql_client.client import Client
Passing headers to client
Client (with default base client), takes passed headers and attaches them to every sent request.
client = Client("https://example.com/graphql", {"Authorization": "Bearer token"})
For more complex scenarios, you can pass your own http client:
client = Client(http_client=CustomComplexHttpClient())
Custom scalars
By default, not built-in scalars are represented as typing.Any in generated client.
You can provide information about specific scalar by adding section to pyproject.toml:
[ariadne-codegen.scalars.{graphql scalar name}]
type = "(required) python type name"
serialize = "function used to serialize scalar"
parse = "function used to create scalar instance from serialized form"
import = "module to import from"
All occurences of {graphql scalar name} will be represented as type. If provided, serialize and parse will be used for serialization and deserialization. In all files which use type/serialize/parse there will be added extra import from {import} import {type}, {serialize}, {parse}
Example with scalar mapped to built-in type
In this case scalar is mapped to built-in str which doesn`t require custom serialize and parse methods.
[ariadne-codegen.scalars.SCALARA]
type = "str"
Example with type supported by pydantic
In this scenario scalar is represented as datetime, so it needs to be imported. Pydantic handles serialization and deserialization so custom parse and serialize is not necessary.
[ariadne-codegen.scalars.DATETIME]
type = "datetime"
import = "datetime"
Example with fully custom type
In this example scalar is represented as class TypeB. Pydantic can`t handle serialization and deserialization so custom parse and serialize is necessary. To provide type, parse and serialize implementation we can use files_to_include to copy type_b.py file.
[ariadne-codegen]
...
files_to_include = [".../type_b.py"]
[ariadne-codegen.scalars.SCALARB]
type = "TypeB"
parse = "parse_b"
serialize = "serialize_b"
import = ".type_b"
Extending generated types
Extending models with custom mixins
mixin directive allows to extend class generated for query/mutation field with custom logic.
mixin takes two required arguments:
from- name of a module to import fromimport- name of a parent class
Generated class will use import as extra base class, and import will be added to the file.
from {from} import {import}
...
class OperationNameField(BaseModel, {import}):
...
This directive can be used along with files_to_include option to extend funcionallity of generated classes.
Example of usage of mixin and files_to_include:
Query with mixin directive:
query listUsers {
users @mixin(from: ".mixins", import: "UsersMixin") {
id
}
}
Part of pyproject.toml with files_to_include (mixins.py contains UsersMixin implementation)
files_to_include = [".../mixins.py"]
Part of generated list_users.py file:
...
from .mixins import UsersMixin
...
class ListUsersUsers(BaseModel, UsersMixin):
...
Generated code dependencies
Generated code requires:
- pydantic
- httpx (can be avoided by providing another base client class with
base_client_file_pathandbase_client_nameparameters)
Example
Example with simple schema and few queries and mutations is available here.
Contributing
We welcome all contributions to Ariadne! If you've found a bug or issue, feel free to use GitHub issues. If you have any questions or feedback, don't hesitate to catch us on GitHub discussions.
Also make sure you follow @AriadneGraphQL on Twitter for latest updates, news and random musings!
Crafted with ❤️ by Mirumee Software hello@mirumee.com
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ariadne_codegen-0.3.0.tar.gz.
File metadata
- Download URL: ariadne_codegen-0.3.0.tar.gz
- Upload date:
- Size: 26.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b7680451e81ec5658ac4c09605ed7277a89ab18fe412c7ef35ad3d6519966e4a
|
|
| MD5 |
7f1cde4dd7c5382a38a7a47405b26900
|
|
| BLAKE2b-256 |
95dac0c8d07103f4c574af31776dc8adb75314c3d574ecd36f0393ed3f1f8c2e
|
File details
Details for the file ariadne_codegen-0.3.0-py2.py3-none-any.whl.
File metadata
- Download URL: ariadne_codegen-0.3.0-py2.py3-none-any.whl
- Upload date:
- Size: 42.1 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.11.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
70aef9d2c3a3131f0ddf10558fba3926480199e6d243b11d41e3834faa4424f2
|
|
| MD5 |
4b2cb72509ed368bf42cf1141e288c52
|
|
| BLAKE2b-256 |
a4c42fc28ffd360d83f7f662e46c6a0283ebe3abdb2f739668b647c9a8b6027d
|