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))