Skip to content

Instantly share code, notes, and snippets.

@caarmen
Last active May 22, 2022 16:20
Show Gist options
  • Save caarmen/0aab186d7c02d2762f40b0d5ad8df729 to your computer and use it in GitHub Desktop.
Save caarmen/0aab186d7c02d2762f40b0d5ad8df729 to your computer and use it in GitHub Desktop.
Script to retrieve paginated data from the star wars graphql server.
"""
Exploration of a graphql client in Python
"""
import asyncio
from dataclasses import dataclass
from typing import Generator
from gql import gql
from gql.client import Client, AsyncClientSession
from gql.transport.aiohttp import AIOHTTPTransport
def _create_query(after_cursor: str = None) -> str:
after = '' if after_cursor is None else f'after: "{after_cursor}"'
return f'''
query {{
allPeople(first:10, {after}) {{
pageInfo {{
endCursor
hasNextPage
}}
edges {{
cursor
node {{
name
homeworld {{
name
}}
}}
}}
}}
}}
'''
@dataclass
class SwEntry:
"""
One entry in the sw dataset
"""
person_name: str
homeworld_name: str
def _person_to_sw_entry(person: dict) -> SwEntry:
return SwEntry(
person_name=person["name"],
homeworld_name=person["homeworld"]["name"]
)
def _people_edges_to_sw_entries(people_edges: list[dict]) -> list[SwEntry]:
return [_person_to_sw_entry(people_edge["node"]) for people_edge in people_edges]
async def _result_generator(session: AsyncClientSession) -> Generator[list[SwEntry], None, None]:
page_info = {}
while page_info.get("hasNextPage", True):
# Get the current page data
query = gql(_create_query(page_info.get("endCursor")))
data = await session.execute(query)
people_connection = data["allPeople"]
yield _people_edges_to_sw_entries(people_connection["edges"])
# Prepare the next page query
page_info = people_connection["pageInfo"]
def _sw_entry_to_display(sw_entry: SwEntry) -> str:
return f"{sw_entry.person_name}: {sw_entry.homeworld_name}"
async def main():
"""
Print data from the swapi graphql endpoint
"""
transport = AIOHTTPTransport(url="https://swapi-graphql.netlify.app/.netlify/functions/index")
async with Client(
transport=transport,
fetch_schema_from_transport=True,
serialize_variables=True,
parse_results=True
) as session:
async for sw_entries in _result_generator(session):
sw_entries_display_strings = [_sw_entry_to_display(sw_entry) for sw_entry in sw_entries]
print("\n".join(sw_entries_display_strings))
asyncio.run(main())
@caarmen
Copy link
Author

caarmen commented May 22, 2022

First:

pip install gql
pip install aiohttp

Then:

% python swapi-graphql-client.py
Luke Skywalker: Tatooine
C-3PO: Tatooine
R2-D2: Naboo
Darth Vader: Tatooine
Leia Organa: Alderaan
Owen Lars: Tatooine
Beru Whitesun lars: Tatooine
R5-D4: Tatooine
Biggs Darklighter: Tatooine
Obi-Wan Kenobi: Stewjon
Anakin Skywalker: Tatooine
Wilhuff Tarkin: Eriadu
Chewbacca: Kashyyyk
Han Solo: Corellia
Greedo: Rodia
Jabba Desilijic Tiure: Nal Hutta
Wedge Antilles: Corellia
Jek Tono Porkins: Bestine IV
Yoda: unknown
Palpatine: Naboo
Boba Fett: Kamino
IG-88: unknown
Bossk: Trandosha
Lando Calrissian: Socorro
Lobot: Bespin
Ackbar: Mon Cala
Mon Mothma: Chandrila
Arvel Crynyd: unknown
Wicket Systri Warrick: Endor
Nien Nunb: Sullust
Qui-Gon Jinn: unknown
Nute Gunray: Cato Neimoidia
Finis Valorum: Coruscant
Padmé Amidala: Naboo
Jar Jar Binks: Naboo
Roos Tarpals: Naboo
Rugor Nass: Naboo
Ric Olié: Naboo
Watto: Toydaria
Sebulba: Malastare
Quarsh Panaka: Naboo
Shmi Skywalker: Tatooine
Darth Maul: Dathomir
Bib Fortuna: Ryloth
Ayla Secura: Ryloth
Ratts Tyerel: Aleen Minor
Dud Bolt: Vulpter
Gasgano: Troiken
Ben Quadinaros: Tund
Mace Windu: Haruun Kal
Ki-Adi-Mundi: Cerea
Kit Fisto: Glee Anselm
Eeth Koth: Iridonia
Adi Gallia: Coruscant
Saesee Tiin: Iktotch
Yarael Poof: Quermia
Plo Koon: Dorin
Mas Amedda: Champala
Gregar Typho: Naboo
Cordé: Naboo
Cliegg Lars: Tatooine
Poggle the Lesser: Geonosis
Luminara Unduli: Mirial
Barriss Offee: Mirial
Dormé: Naboo
Dooku: Serenno
Bail Prestor Organa: Alderaan
Jango Fett: Concord Dawn
Zam Wesell: Zolan
Dexter Jettster: Ojom
Lama Su: Kamino
Taun We: Kamino
Jocasta Nu: Coruscant
R4-P17: unknown
Wat Tambor: Skako
San Hill: Muunilinst
Shaak Ti: Shili
Grievous: Kalee
Tarfful: Kashyyyk
Raymus Antilles: Alderaan
Sly Moore: Umbara
Tion Medon: Utapau

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment