Schema Gen is a simple CLI tool that generates Python GraphQL implementations(using Graphene) from a Graphql Schema file.
pip install schemagen
Here's the content of a sample input file(we will call it test.graphql)
type User {
id: ID!
username: String
first_name: String
last_name: String
full_name: String
name: String
name: String
}
Now let's use SchemaGen to generate python code from it.
As a CLI tool:
schemagen parse test.graphql -o test.py
As a Python Package:
from schemagen import SchemaGen
gen = SchemaGen(
input_file='test.graphql',
output_file='test.py'
)
# parse input file
gen()
Output(test.py):
# This file was generated by CodegenTool
from graphene import *
class User(ObjectType):
id = Field(ID, required=True)
username = Field(String)
first_name = Field(String)
last_name = Field(String)
full_name = Field(String)
name = Field(String)
Here are some things you should know about using SchemaGen:
-
SchemaGen is not guaranteed to catch errors in your GraphQL schema file.
SchemaGen will only catch a very small percentage of errors that might occur in defining a GraphQL schema. It is the developer's responsibility to ensure the GraphQL schema file is error-free.
-
SchemaGen will not install the graphene package on your local machine however it will import it in the generated python file.
You can easily install the package by running:
pip install graphene
-
GraphQL type declarations in your schema file must be ordered.
Because of the way Python and SchemaGen works, you cannot use a GraphQL type before declaring it. For example, the following graphql schema definition would be invalid because we are using the Url scalar in our User type before declaring it:
type User { id: ID! username: String avatar_url: Url } scalar Url
The correct version of the above code is:
scalar Url type User { id: ID! username: String avatar_url: Url }
-
Using a GraphQL SDL keyword as an object field name in your schema will throw an error.
For example, doing this:
enum UserType { Example } type User{ name: String type: UserType }
will throw an error.
Do this instead:
enum UserType { Example } type User{ name: String user_type: UserType }
I plan to fix the last two issues stated above in the future. Pull requests are welcome!