{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Query the notebook ContentsManager with GraphQL\n",
"[ graphql-python/gql](https://github.com/graphql-python/gql) is the python GraphQL client of the [Graphene](https://graphene-python.org/) family, which powers the backend (based on [ dronedeploy/graphene-tornado](https://github.com/dronedeploy/graphene-tornado)). There are a few others, not yet reviewed:\n",
"- [ ariebovenberg/quiz](https://github.com/ariebovenberg/quiz)\n",
"- [ prisma/python-graphql-client](https://github.com/prisma/python-graphql-client)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from pprint import pprint\n",
"from getpass import getpass\n",
"from gql import Client, gql\n",
"from gql.transport.requests import RequestsHTTPTransport\n",
"from IPython.display import JSON, IFrame\n",
"import requests # should investigate writing a tornado transport"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Client!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This has to know where you are. For example for `http://localhost:8888/lab`:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"URL = \"http://localhost:8888/graphql\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Since this is a _kernel_ talking back to the notebook _server_, you'll need your `jupyter notebook` or `jupyter lab` token (view source, look for `\"token\"`)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"token = getpass()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"client = Client(\n",
" transport=RequestsHTTPTransport(URL, use_json=True, headers=dict(Authorization=f\"token {token}\")),\n",
" fetch_schema_from_transport=True,\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Query!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"query = \"\"\"{\n",
" contents(path: \"notebooks/gql.ipynb\") {\n",
" path\n",
" last_modified\n",
" ... on NotebookContents {\n",
" content {\n",
" nbformat\n",
" nbformat_minor\n",
" cells {\n",
" edges {\n",
" node {\n",
" source\n",
" }\n",
" }\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\"\"\"\n",
"query_gql = gql(query)\n",
"query_gql"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Whatever that means. Lets actually run it!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"result = client.execute(query_gql)\n",
"JSON(result)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Where can you go from here? "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Subscribe!\n",
"With a little work up-front and even less work at query time, the same types from above can be used to power live _subscriptions_. Right now, only contents are available, but many things in the notebook server and broader ecosystem could become \"live\"."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"subscription = f\"subscription {query}\"\n",
"print(subscription)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Go ahead and paste that in the iframe below and hit (▷)!\n",
"> TODO: fix query param parsing!"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"IFrame(URL, width=\"100%\", height=\"400px\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.7"
}
},
"nbformat": 4,
"nbformat_minor": 2
}