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