Skip to content

Instantly share code, notes, and snippets.

@ryan-williams
Last active May 27, 2020 21:03
Show Gist options
  • Save ryan-williams/7be1769599557082284372c7b61dccb8 to your computer and use it in GitHub Desktop.
Save ryan-williams/7be1769599557082284372c7b61dccb8 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Ensure [`core-devs`](https://github.com/orgs/zarr-developers/teams/core-devs)' access to [all public Zarr repos](https://github.com/zarr-developers?type=public)\n",
"We'd like to host private repos under [`zarr-developers`](https://github.com/zarr-developers) with whitelisted access (even to strict subsets of the \"[organization members](https://github.com/orgs/zarr-developers/people)\").\n",
"\n",
"Contract documents and discussions, and other [steering-council](https://github.com/orgs/zarr-developers/teams/steering-council) matters, are the main impetus for this.\n",
"\n",
"Below we use the GitHub API to make sure [the `core-devs` team](https://github.com/orgs/zarr-developers/teams/core-devs) has admin rights to all public repos."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"from sys import executable as python\n",
"!{python} -m pip install -q PyGithub pandas"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from github import Github\n",
"gh = Github()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Organization(login=\"zarr-developers\")"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"org = gh.get_organization('zarr-developers'); org"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get the `core-devs` team:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"[Team(name=\"appveyor-admins\", id=2599636),\n",
" Team(name=\"core-devs\", id=2848789),\n",
" Team(name=\"steering-council\", id=3704862)]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"teams = list(org.get_teams()); teams"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"[core_devs] = [t for t in teams if t.name == 'core-devs']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Build a DataFrame with repo info:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[Repository(full_name=\"zarr-developers/zarr-python\"),\n",
" Repository(full_name=\"zarr-developers/numcodecs\"),\n",
" Repository(full_name=\"zarr-developers/numcodecs-feedstock\"),\n",
" Repository(full_name=\"zarr-developers/zarr-feedstock\"),\n",
" Repository(full_name=\"zarr-developers/zarr-specs\"),\n",
" Repository(full_name=\"zarr-developers/zarr-paper\"),\n",
" Repository(full_name=\"zarr-developers/governance\"),\n",
" Repository(full_name=\"zarr-developers/zarr-developers.github.io\"),\n",
" Repository(full_name=\"zarr-developers/community\"),\n",
" Repository(full_name=\"zarr-developers/.github\"),\n",
" Repository(full_name=\"zarr-developers/steering-committee\")]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"repos = list(org.get_repos()); repos"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>private</th>\n",
" <th>obj</th>\n",
" </tr>\n",
" <tr>\n",
" <th>name</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>zarr-python</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/zarr-pyt...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>numcodecs</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/numcodecs\")</td>\n",
" </tr>\n",
" <tr>\n",
" <th>numcodecs-feedstock</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/numcodec...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>zarr-feedstock</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/zarr-fee...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>zarr-specs</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/zarr-spe...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>zarr-paper</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/zarr-pap...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>governance</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/governan...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>zarr-developers.github.io</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/zarr-dev...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>community</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/community\")</td>\n",
" </tr>\n",
" <tr>\n",
" <th>.github</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/.github\")</td>\n",
" </tr>\n",
" <tr>\n",
" <th>steering-committee</th>\n",
" <td>True</td>\n",
" <td>Repository(full_name=\"zarr-developers/steering...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" private \\\n",
"name \n",
"zarr-python False \n",
"numcodecs False \n",
"numcodecs-feedstock False \n",
"zarr-feedstock False \n",
"zarr-specs False \n",
"zarr-paper False \n",
"governance False \n",
"zarr-developers.github.io False \n",
"community False \n",
".github False \n",
"steering-committee True \n",
"\n",
" obj \n",
"name \n",
"zarr-python Repository(full_name=\"zarr-developers/zarr-pyt... \n",
"numcodecs Repository(full_name=\"zarr-developers/numcodecs\") \n",
"numcodecs-feedstock Repository(full_name=\"zarr-developers/numcodec... \n",
"zarr-feedstock Repository(full_name=\"zarr-developers/zarr-fee... \n",
"zarr-specs Repository(full_name=\"zarr-developers/zarr-spe... \n",
"zarr-paper Repository(full_name=\"zarr-developers/zarr-pap... \n",
"governance Repository(full_name=\"zarr-developers/governan... \n",
"zarr-developers.github.io Repository(full_name=\"zarr-developers/zarr-dev... \n",
"community Repository(full_name=\"zarr-developers/community\") \n",
".github Repository(full_name=\"zarr-developers/.github\") \n",
"steering-committee Repository(full_name=\"zarr-developers/steering... "
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"\n",
"def obj(o, *args, **kwargs):\n",
" return {\n",
" **{ k: getattr(o, k) for k in args },\n",
" **{ k: fn(o) for k, fn in kwargs.items() }\n",
" }\n",
"\n",
"repos = pd.DataFrame([ \n",
" obj(r, 'name', 'private', obj=lambda r: r)\n",
" for r in repos\n",
"]) \\\n",
".set_index('name')\n",
"\n",
"repos"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Add `core-devs`' permissions:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>private</th>\n",
" <th>obj</th>\n",
" <th>push</th>\n",
" <th>pull</th>\n",
" <th>admin</th>\n",
" </tr>\n",
" <tr>\n",
" <th>name</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>zarr-python</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/zarr-pyt...</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>numcodecs</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/numcodecs\")</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>numcodecs-feedstock</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/numcodec...</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>zarr-feedstock</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/zarr-fee...</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>zarr-specs</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/zarr-spe...</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>zarr-paper</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/zarr-pap...</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>governance</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/governan...</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>zarr-developers.github.io</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/zarr-dev...</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>community</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/community\")</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>.github</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/.github\")</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>steering-committee</th>\n",
" <td>True</td>\n",
" <td>Repository(full_name=\"zarr-developers/steering...</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" private \\\n",
"name \n",
"zarr-python False \n",
"numcodecs False \n",
"numcodecs-feedstock False \n",
"zarr-feedstock False \n",
"zarr-specs False \n",
"zarr-paper False \n",
"governance False \n",
"zarr-developers.github.io False \n",
"community False \n",
".github False \n",
"steering-committee True \n",
"\n",
" obj \\\n",
"name \n",
"zarr-python Repository(full_name=\"zarr-developers/zarr-pyt... \n",
"numcodecs Repository(full_name=\"zarr-developers/numcodecs\") \n",
"numcodecs-feedstock Repository(full_name=\"zarr-developers/numcodec... \n",
"zarr-feedstock Repository(full_name=\"zarr-developers/zarr-fee... \n",
"zarr-specs Repository(full_name=\"zarr-developers/zarr-spe... \n",
"zarr-paper Repository(full_name=\"zarr-developers/zarr-pap... \n",
"governance Repository(full_name=\"zarr-developers/governan... \n",
"zarr-developers.github.io Repository(full_name=\"zarr-developers/zarr-dev... \n",
"community Repository(full_name=\"zarr-developers/community\") \n",
".github Repository(full_name=\"zarr-developers/.github\") \n",
"steering-committee Repository(full_name=\"zarr-developers/steering... \n",
"\n",
" push pull admin \n",
"name \n",
"zarr-python True True False \n",
"numcodecs True True False \n",
"numcodecs-feedstock True True False \n",
"zarr-feedstock True True False \n",
"zarr-specs True True False \n",
"zarr-paper True True True \n",
"governance True True True \n",
"zarr-developers.github.io True True False \n",
"community True True True \n",
".github True True True \n",
"steering-committee False False False "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from functools import partial\n",
"def team_permissions(repo, team):\n",
" permissions = core_devs.get_repo_permission(repo)\n",
" if not permissions: return {}\n",
" return obj(permissions, 'push', 'pull', 'admin')\n",
"\n",
"permissions = \\\n",
" repos.obj \\\n",
" .apply(partial(team_permissions, team=core_devs)) \\\n",
" .apply(pd.Series) \\\n",
" .fillna(0) \\\n",
" .astype(bool)\n",
"\n",
"repos = pd.concat([repos, permissions],axis=1)\n",
"repos"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Repositories that require granting `core-devs` `admin` rights to:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>private</th>\n",
" <th>obj</th>\n",
" <th>push</th>\n",
" <th>pull</th>\n",
" <th>admin</th>\n",
" </tr>\n",
" <tr>\n",
" <th>name</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>zarr-python</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/zarr-pyt...</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>numcodecs</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/numcodecs\")</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>numcodecs-feedstock</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/numcodec...</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>zarr-feedstock</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/zarr-fee...</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>zarr-specs</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/zarr-spe...</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" </tr>\n",
" <tr>\n",
" <th>zarr-developers.github.io</th>\n",
" <td>False</td>\n",
" <td>Repository(full_name=\"zarr-developers/zarr-dev...</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" private \\\n",
"name \n",
"zarr-python False \n",
"numcodecs False \n",
"numcodecs-feedstock False \n",
"zarr-feedstock False \n",
"zarr-specs False \n",
"zarr-developers.github.io False \n",
"\n",
" obj \\\n",
"name \n",
"zarr-python Repository(full_name=\"zarr-developers/zarr-pyt... \n",
"numcodecs Repository(full_name=\"zarr-developers/numcodecs\") \n",
"numcodecs-feedstock Repository(full_name=\"zarr-developers/numcodec... \n",
"zarr-feedstock Repository(full_name=\"zarr-developers/zarr-fee... \n",
"zarr-specs Repository(full_name=\"zarr-developers/zarr-spe... \n",
"zarr-developers.github.io Repository(full_name=\"zarr-developers/zarr-dev... \n",
"\n",
" push pull admin \n",
"name \n",
"zarr-python True True False \n",
"numcodecs True True False \n",
"numcodecs-feedstock True True False \n",
"zarr-feedstock True True False \n",
"zarr-specs True True False \n",
"zarr-developers.github.io True True False "
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"add_admin = repos[~repos.private & ~repos.admin]; add_admin"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"adding core-devs to repo zarr-developers/zarr-python with admin rights\n",
"adding core-devs to repo zarr-developers/numcodecs with admin rights\n",
"adding core-devs to repo zarr-developers/numcodecs-feedstock with admin rights\n",
"adding core-devs to repo zarr-developers/zarr-feedstock with admin rights\n",
"adding core-devs to repo zarr-developers/zarr-specs with admin rights\n",
"adding core-devs to repo zarr-developers/zarr-developers.github.io with admin rights\n"
]
}
],
"source": [
"for repo in add_admin.obj:\n",
" role = 'admin'\n",
" print(f'adding {core_devs.name} to repo {repo.full_name} with {role} rights')\n",
" core_devs.set_repo_permission(repo, role)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Re-fetch permissions, make sure `admin` is set everywhere it should be:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>push</th>\n",
" <th>pull</th>\n",
" <th>admin</th>\n",
" </tr>\n",
" <tr>\n",
" <th>name</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>zarr-python</th>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>numcodecs</th>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>numcodecs-feedstock</th>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>zarr-feedstock</th>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>zarr-specs</th>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>zarr-paper</th>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>governance</th>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>zarr-developers.github.io</th>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>community</th>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>.github</th>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>steering-committee</th>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" <td>False</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" push pull admin\n",
"name \n",
"zarr-python True True True\n",
"numcodecs True True True\n",
"numcodecs-feedstock True True True\n",
"zarr-feedstock True True True\n",
"zarr-specs True True True\n",
"zarr-paper True True True\n",
"governance True True True\n",
"zarr-developers.github.io True True True\n",
"community True True True\n",
".github True True True\n",
"steering-committee False False False"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"repos.obj \\\n",
" .apply(partial(team_permissions, team=core_devs)) \\\n",
" .apply(pd.Series) \\\n",
" .fillna(0) \\\n",
" .astype(bool)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "zarr-3.7.3",
"language": "python",
"name": "zarr-3.7.3"
},
"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.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment