forked from gradio-app/gradio
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenerate_notebooks.py
122 lines (104 loc) · 3.83 KB
/
generate_notebooks.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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))