Calling GraphQL API¶
The GitHub GraphQL API offers flexibility and the ability to define precisely the data you want to fetch. See the GitHub GraphQL API documentation for more information.
The Basics¶
Before calling the GraphQL API, you could create your query from the GitHub GraphQL Explorer. For example, to get current login user:
query = """
{
viewer {
login
}
}
"""
Then, you can call the GraphQL API with the query:
data: dict[str, Any] = github.graphql(query)
user_login: str = data["viewer"]["login"]
data: dict[str, Any] = await github.async_graphql(query)
user_login: str = data["viewer"]["login"]
Calling GraphQL API with variables:
query = """
query ($owner: String!, $repo: String!) {
repository(owner: $owner, name: $repo) {
name
}
}
"""
data: dict[str, Any] = github.graphql(query, variables={"owner": "owner", "repo": "repo"})
repo_name: str = data["repository"]["name"]
query = """
query ($owner: String!, $repo: String!) {
repository(owner: $owner, name: $repo) {
name
}
}
"""
data: dict[str, Any] = await github.async_graphql(query, variables={"owner": "owner", "repo": "repo"})
repo_name: str = data["repository"]["name"]
GraphQL Pagination¶
githubkit also provides a helper function to paginate the GraphQL API.
First, You must accept a cursor
parameter and return a pageInfo
object in your query. For example:
query ($owner: String!, $repo: String!, $cursor: String) {
repository(owner: $owner, name: $repo) {
issues(first: 10, after: $cursor) {
nodes {
number
}
pageInfo {
hasNextPage
endCursor
}
}
}
}
The pageInfo
object in your query must be one of the following types depending on the direction of the pagination:
For forward pagination, use:
pageInfo {
hasNextPage
endCursor
}
For backward pagination, use:
pageInfo {
hasPreviousPage
startCursor
}
If you provide all 4 properties in a pageInfo
, githubkit will default to forward pagination.
Then, you can iterate over the paginated results by using the graphql paginate
method:
for result in github.graphql.paginate(
query, variables={"owner": "owner", "repo": "repo"}
):
print(result)
Note that the result
is a dict containing the list of nodes/edges for each page and the pageInfo
object. You should iterate over the nodes
or edges
list to get the actual data. For example:
for result in g.graphql.paginate(query, {"owner": "owner", "repo": "repo"}):
for issue in result["repository"]["issues"]["nodes"]:
print(issue)
You can also provide a initial cursor value to start pagination from a specific point:
for result in github.graphql.paginate(
query, variables={"owner": "owner", "repo": "repo", "cursor": "initial_cursor"}
):
print(result)
Tips
Nested pagination is not supported.