gradio/scripts/generate_notebooks.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

123 lines
3.8 KiB
Python
Raw Normal View History

import json
import os
import random
import subprocess
from pathlib import Path
import nbformat as nbf
GRADIO_DEMO_DIR = Path.cwd() / "demo"
DEMOS_TO_SKIP = {"all_demos", "reset_components", "custom_path", "kitchen_sink_random"}
demos = os.listdir(GRADIO_DEMO_DIR)
demos = [
demo
for demo in demos
if demo not in DEMOS_TO_SKIP
and os.path.isdir(os.path.join(GRADIO_DEMO_DIR, demo))
and os.path.exists(os.path.join(GRADIO_DEMO_DIR, demo, "run.py"))
]
def git_tracked(demo, file):
osstdout = subprocess.Popen(
f"cd demo/{demo} && git ls-files --error-unmatch {file}",
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
close_fds=True,
)
osstdout.wait()
return not osstdout.returncode
for demo in demos:
nb = nbf.v4.new_notebook()
text = f"# Gradio Demo: {demo}"
if os.path.exists(os.path.join(GRADIO_DEMO_DIR, demo, "DESCRIPTION.md")):
with open(
os.path.join(GRADIO_DEMO_DIR, demo, "DESCRIPTION.md"), encoding="utf8"
) as f:
description = f.read()
text += f"""\n### {description}
"""
files = os.listdir(os.path.join(GRADIO_DEMO_DIR, demo))
skip = [
"run.py",
"run.ipynb",
"setup.sh",
".gitignore",
"requirements.txt",
"DESCRIPTION.md",
"screenshot.png",
"screenshot.gif",
]
files = [file for file in files if file not in skip if git_tracked(demo, file)]
files.sort()
if files:
get_files = "# Downloading files from the demo repo\nimport os"
for file in files:
if os.path.isdir(os.path.join(GRADIO_DEMO_DIR, demo, file)):
sub_files = os.listdir(os.path.join(GRADIO_DEMO_DIR, demo, file))
sub_files = [
sub
for sub in sub_files
if sub not in skip
if git_tracked(demo, f"{file}/{sub}")
]
sub_files.sort()
if sub_files:
get_files += f"\nos.mkdir('{file}')"
for sub_file in sub_files:
get_files += f"\n!wget -q -O {file}/{sub_file} https://github.com/gradio-app/gradio/raw/main/demo/{demo}/{file}/{sub_file}"
else:
get_files += f"\n!wget -q https://github.com/gradio-app/gradio/raw/main/demo/{demo}/{file}"
requirements = ""
if os.path.exists(os.path.join(GRADIO_DEMO_DIR, demo, "requirements.txt")):
with open(
os.path.join(GRADIO_DEMO_DIR, demo, "requirements.txt"),
encoding="utf8",
) as f:
requirements = f.read().split("\n")
requirements = " ".join(requirements)
installs = f"!pip install -q gradio {requirements}"
with open(os.path.join(GRADIO_DEMO_DIR, demo, "run.py"), encoding="utf8") as f:
code = f.read()
code = code.replace("os.path.dirname(__file__)", "os.path.abspath('')")
if files:
nb["cells"] = [
nbf.v4.new_markdown_cell(text),
nbf.v4.new_code_cell(installs),
nbf.v4.new_code_cell(get_files),
nbf.v4.new_code_cell(code),
]
else:
nb["cells"] = [
nbf.v4.new_markdown_cell(text),
nbf.v4.new_code_cell(installs),
nbf.v4.new_code_cell(code),
]
output_notebook = os.path.join(GRADIO_DEMO_DIR, demo, "run.ipynb")
with open(output_notebook, "w", encoding="utf8") as f:
nbf.write(nb, f)
with open(output_notebook, encoding="utf8") as f:
content = f.read()
content = json.loads(content)
for i, cell in enumerate(content["cells"]):
random.seed(i)
cell["id"] = str(random.getrandbits(128))
with open(output_notebook, "w", encoding="utf8") as f:
f.write(json.dumps(content))