Auto-generate GraphQL Type, Resolver and Query.
pip install gqlcli
- more rule for client command
- support schema directory
Usage: gqlcli [OPTIONS] COMMAND [ARGS]...
Options:
-f, --file TEXT graphql sdl file, file extension may be .gql or .graphql
--help Show this message and exit.
Commands:
all Generate all schema types
c Generate client query
fr Generate field resolver.
postman Export all client query to postman.
pt Print type definition
t Generate one type
tr Generate type resolver
-f
option will auto find sdl file with.gql
or.graphql
extension in current dir.
gqlcli -p schema.graphql
same withgqlcli
GraphQL schema example:
enum Episode { NEWHOPE, EMPIRE, JEDI }
interface Character {
id: String!
name: String
friends: [Character]
appearsIn: [Episode]
}
type Human implements Character {
id: String!
name: String
friends: [Character]
appearsIn: [Episode]
homePlanet: String
}
type Droid implements Character {
id: String!
name: String
friends: [Character]
appearsIn: [Episode]
primaryFunction: String
}
type Query {
hero(episode: Episode): Character
human(id: String!): Human
droid(id: String!): Droid
}
all
command can generate all schema types, based on default class, dataclass or pydantic, default is pydantic.
gqlcli all --kind pydantic
from enum import Enum
from typing import Any, Dict, List, NewType, Optional, Text, Union
from gql import enum_type, type_resolver
from pydantic import BaseModel
ID = NewType('ID', Text)
@enum_type
class Episode(Enum):
NEWHOPE = 1
EMPIRE = 2
JEDI = 3
class Character(BaseModel):
id: Text
name: Optional[Text]
friends: Optional[List[Optional['Character']]]
appears_in: Optional[List[Optional[Episode]]]
class Human(Character):
id: Text
name: Optional[Text]
friends: Optional[List[Optional['Character']]]
appears_in: Optional[List[Optional[Episode]]]
home_planet: Optional[Text]
class Droid(Character):
id: Text
name: Optional[Text]
friends: Optional[List[Optional['Character']]]
appears_in: Optional[List[Optional[Episode]]]
primary_function: Optional[Text]
@type_resolver('Character')
def resolve_character_type(obj, info, type_):
if isinstance(obj, Human):
return 'Human'
if isinstance(obj, Droid):
return 'Droid'
return None
for
gql
package, please see python-gql for detail.
c
command generate query string.
gqlcli c hero
query hero($episode: Episode) {
hero(episode: $episode) {
id
name
friends
appearsIn
}
}
fr
command generate field resolver.
gqlcli fr Query hero
@query
def hero(parent, info, episode: Optional[Episode]) -> Optional['Character']:
pass
tr
command generate type resolver.
gqlcli tr Character
@type_resolver('Character')
def resolve_character_type(obj, info, type_):
if isinstance(obj, Human):
return 'Human'
if isinstance(obj, Droid):
return 'Droid'
return None
t
command generate given type.
gqlcli c Character
class Character(BaseModel):
id: Text
name: Optional[Text]
friends: Optional[List[Optional['Character']]]
appears_in: Optional[List[Optional[Episode]]]
pt
command print type definition.
gqlcli pt Character
interface Character {
id: String!
name: String
friends: [Character]
appearsIn: [Episode]
}
Generate a postman collection.
Example:
gqlcli -p ./schema.graphql postman -H X-Authenticated-Scope:authenticated -H X-Authenticated-Userid:"{\"id\": \"{{USER}}\", \"meta\": {\"company_id\": {{COMPANY}}, \"is_superuser\": {{SUPERUSER}}}}" -H Authorization:"Token {{TOKEN}}" example